Как в Django admin скрыть кнопки "Сохранить и продолжить", "Сохранить и добавить еще" на модели администратора?
У меня есть рабочий процесс для модели в админке 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
Любая подсказка или альтернативный способ?
заранее спасибо
4 ответа
Помимо его (немного неловкого) стиля взлома, вы также можете переопределить тег шаблона напрямую. Обычно рекомендуется переопределить шаблон.
# 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
Насколько я могу судить, это невозможно с опцией "из коробки", но именно так я поступил бы, делая то, что вы хотите.
Часть кода, о которой мы заботимся, это этот тег шаблона - кажется, он переопределяет show_save_and_add_another
а также show_save_and_continue
независимо от того, что вы установили. Он также создает совершенно новый контекст и копирует только определенные значения (неясно, каково это обоснование), поэтому вам придется изменить его, чтобы получить то, что вам нужно.
Так:
- Создайте тег шаблона, который повторяет функциональность тега по умолчанию, либо повторно используя существующий (см. Пример okm), либо полностью продублировав его. Единственное изменение здесь заключается в том, что он должен либо сохранить ваши
show_save_and_add_another
из исходного контекста, не перезаписывая его, или пройти через свой собственныйreally_hide_save_and_add_another_damnit
контекстная переменная. - Замените change_form.html, чтобы включить и использовать свой собственный тег шаблона, заменяя
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, не передающий весь исходный контекст.
Совсем другой подход может заключаться в добавлении следующего в /static/admin/css/base.css
input[name="_addanother"],input[name="_continue"],input[name="_saveasnew"]{
display: none;
}
Чтобы удалить кнопку «Сохранить и продолжить редактирование» и кнопку «Сохранить и добавить еще» , установите для «False» значение «extra_context['show_save_and_continue']» в «changeform_view()» и верните «False» в «has_add_permission()» соответственно как показано ниже:
# "admin.py"
from django.contrib import admin
from .models import MyModel
@admin.register(MyModel)
class MyModelAdmin(admin.ModelAdmin):
def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
extra_context = extra_context or {}
extra_context['show_save_and_continue'] = False # Here
return super().changeform_view(request, object_id, form_url, extra_context)
def has_add_permission(self, request, obj=None): # Here
return False