Модель администратора Django add_view: как убрать кнопки "сохранить и добавить еще"?
Мне удалось удалить кнопки "сохранить и добавить еще" и "сохранить и продолжить редактирование" с помощью следующего кода:
# At the start of my admin.py file I have:
from django.contrib.admin.templatetags.admin_modify import *
from django.contrib.admin.templatetags.admin_modify import submit_row as original_submit_row
@register.inclusion_tag('admin/submit_line.html', takes_context=True)
def submit_row(context):
ctx = original_submit_row(context)
ctx.update({
'show_save_and_add_another': context.get('show_save_and_add_another', ctx['show_save_and_add_another']),
'show_save_and_continue': context.get('show_save_and_continue', ctx['show_save_and_continue'])
})
return ctx
class MyModelAdmin(GuardedModelAdmin):
# Then inside MyModelAdmin I have this:
def change_view(self, request, object_id, form_url='', extra_context=None):
extra_context = extra_context or {}
extra_context['show_save_and_add_another'] = False
extra_context['show_save_and_continue'] = False
return super(MyModelAdmin, self).change_view(request, object_id,
form_url, extra_context=extra_context)
Это прекрасно работает, когда я использую свой change_view, но когда я добавляю новый экземпляр модели, кнопки появляются снова. Я попробовал следующее:
def add_view(self, request, form_url='', extra_context=None):
extra_context = extra_context or {}
extra_context['show_save_and_add_another'] = False
extra_context['show_save_and_continue'] = False
return super(MyModelAdmin, self).add_view(self, request, form_url='', extra_context=extra_context)
Но это дает мне причудливую ошибку MissingAtrribute - вот трассировка:
Traceback:
File "/home/username/.virtualenvs/MyProject/lib/python3.3/site-packages/django/core/handlers/base.py" in get_response
114. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/username/.virtualenvs/MyProject/lib/python3.3/site-packages/django/contrib/admin/options.py" in wrapper
432. return self.admin_site.admin_view(view)(*args, **kwargs)
File "/home/username/.virtualenvs/MyProject/lib/python3.3/site-packages/django/utils/decorators.py" in _wrapped_view
99. response = view_func(request, *args, **kwargs)
File "/home/username/.virtualenvs/MyProject/lib/python3.3/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
52. response = view_func(request, *args, **kwargs)
File "/home/username/.virtualenvs/MyProject/lib/python3.3/site-packages/django/contrib/admin/sites.py" in inner
198. return view(request, *args, **kwargs)
File "/home/username/Development/MyProject/webapp/MyModel/admin.py" in add_view
153. return super(MyModelAdmin, self).add_view(self, request, form_url='', extra_context=extra_context)
File "/home/username/.virtualenvs/MyProject/lib/python3.3/site-packages/django/utils/decorators.py" in _wrapper
29. return bound_func(*args, **kwargs)
File "/home/username/.virtualenvs/MyProject/lib/python3.3/site-packages/django/utils/decorators.py" in _wrapped_view
95. result = middleware.process_view(request, view_func, args, kwargs)
File "/home/username/.virtualenvs/MyProject/lib/python3.3/site-packages/django/middleware/csrf.py" in process_view
111. request.COOKIES[settings.CSRF_COOKIE_NAME])
Exception Type: AttributeError at /admin/MyModel/ModelInstance/add/
Exception Value: 'MyModelAdmin' object has no attribute 'COOKIES'
Я использую django-guardian и задаюсь вопросом, не вызывает ли это мою проблему? Кто-нибудь знает, как избавиться от этих надоедливых кнопок из части submit_line шаблона при добавлении нового экземпляра модели?
1 ответ
Если вы хотите просто скрыть эти кнопки в косметических целях, вы также можете использовать CSS, и это может быть не лучшим подходом, так как вы можете включить их обратно, проверив CSS, это, конечно, просто и достаточно детально, чтобы скрыть их только на определенной модели. админы.
admin.py:
class MyModelAdmin(admin.ModelAdmin)
....
class Media:
#js = ('' ) # Can include js if needed
css = {'all': ('my_admin/css/my_model.css', )}
my_model.css находится в папке статических файлов по указанному выше пути.
my_model.css:
/* Optionally make the continue and save button look like primary */
input[name="_continue"]{
border: 2px solid #5b80b2;
background: #7CA0C7;
color: white;
}
/* Hide the "Delete", "Add Another" and "Save" buttons, customize this to what you need */
.deletelink, input[name="_addanother"], input[name="_save"]{
display: none;
}
Классы и имена могут меняться между версиями django для этих кнопок, сейчас я использую Django 1.6.6 и не думаю, что они изменились в последнее время. Если вы хотите, чтобы это было эффективно на всем сайте администратора, вы можете скопировать шаблон по умолчанию admin / base_site.html в ваш статический каталог и перезаписать блок 'extrahead', чтобы включить этот стиль. Смотрите base_site.html.
Надеемся, что CSS-подход поможет:) Он, безусловно, не вызовет никаких ошибок для вас.
У меня этот код работает в небольшом проекте, я не ставлю ссылки, потому что я его вывел, и он работает:)
##admin.py
class Admincommits(admin.ModelAdmin):
list_display = ["id"]
list_filter = ["id"]
search_fields = ["id"]
actions = None
def add_view(self, request, extra_context=None):
if request.user.is_superuser:
extra_context = extra_context or {}
extra_context['show_save_and_continue'] = False
#extra_context['show_save_and_add_another'] = False
#extra_context['show_save'] = False
#extra_context['show_delete'] = False
return super(Admincommits, self).add_view(request, extra_context=extra_context)