Подтвердить что ты не робот

В администраторе 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

Любой ключ или альтернативный способ?

Заранее спасибо

4b9b3361

Ответ 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;
}