Как в 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 независимо от того, что вы установили. Он также создает совершенно новый контекст и копирует только определенные значения (неясно, каково это обоснование), поэтому вам придется изменить его, чтобы получить то, что вам нужно.

Так:

  1. Создайте тег шаблона, который повторяет функциональность тега по умолчанию, либо повторно используя существующий (см. Пример okm), либо полностью продублировав его. Единственное изменение здесь заключается в том, что он должен либо сохранить ваши show_save_and_add_another из исходного контекста, не перезаписывая его, или пройти через свой собственный really_hide_save_and_add_another_damnit контекстная переменная.
  2. Замените change_form.html, чтобы включить и использовать свой собственный тег шаблона, заменяя submit_row с этим.
  3. Обновите файл 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
Другие вопросы по тегам