В администраторе Django, как я могу скрыть кнопки "Сохранить и продолжить" и "Сохранить и добавить еще" в администраторе модели?
У меня есть рабочий процесс для модели в администраторе Django, который очень похож на рабочий процесс пользователей. Во-первых, у меня есть форма с базовыми полями, а затем вторая форма с остальными данными.
Это тот же рабочий процесс, что и auth.user
Мне нужно удалить кнопки "сохранить и продолжить" и "сохранить и добавить другие", чтобы пользователь не нарушил рабочий процесс.
Я попытался добавить его как extra_context
extra_context = {
'show_save_and_add_another': False,
'show_save_and_continue': False
}
и передать его через ModelAdmin.add_view или ModelAdmin.change_view, но он не работает.
Это только для одной модели, поэтому я не хочу удалять из submit_line.html
Любой ключ или альтернативный способ?
Заранее спасибо
Ответы
Ответ 1
Помимо своего (немного неудобного) стиля взлома, вы также можете переопределить тег шаблона напрямую.
Обычно рекомендуется переопределять шаблон.
# put this in some app such as customize/templatetags/admin_modify.py and place the app
# before the 'django.contrib.admin' in the INSTALLED_APPS in settings
from django.contrib.admin.templatetags.admin_modify import *
from django.contrib.admin.templatetags.admin_modify import submit_row as original_submit_row
# or
# original_submit_row = 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
Ответ 2
Это невозможно с параметром "из коробки", насколько я могу судить, но это то, как я буду делать то, что вы хотите сделать.
Бит кода, о котором мы заботимся, этот templatetag - кажется, что он переопределяет show_save_and_add_another
и show_save_and_continue
независимо от того, что у вас есть установите его. Он также создает совершенно новый контекст и копирует только определенные значения (неясно, для чего это оправдание), поэтому вам нужно будет изменить его, чтобы получить то, что вам нужно.
Итак:
- Создайте templatetag, который реплицирует функциональные возможности тега по умолчанию, либо путем повторного использования существующего (см. okm example), либо путем дублирования его полностью. Единственное изменение здесь заключается в том, что он должен либо сохранить ваш
show_save_and_add_another
из исходного контекста, не перезаписывая его, либо передать вашу собственную переменную really_hide_save_and_add_another_damnit
.
- Замените change_form.html, чтобы включить и использовать свой собственный templatetag, заменив
submit_row
на него.
- Обновите change_form.html, если вы решили использовать дополнительную переменную контекста, обернув кнопки с помощью другого условного оператора.
Затем, независимо от того, какой вариант вы использовали, обновите свой ModelAdmin чем-то вроде (на основе этого из документации Django):
class MyModelAdmin(admin.ModelAdmin):
# ...
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
# or
extra_context['really_hide_save_and_add_another_damnit'] = True
return super(MyModelAdmin, self).change_view(request, object_id,
form_url, extra_context=extra_context)
Обновлено: Оригинальный ответ не потребовался, чтобы передать submit_row, не проходящий по всему исходному контексту.
Ответ 3
Совсем другой подход может заключаться в следующем:
/static/admin/css/base.css
input[name="_addanother"],input[name="_continue"],input[name="_saveasnew"]{
display: none;
}