Создание пользовательских кнопок в admin change_form в Django

Я хочу добавить пользовательские кнопки в форму добавления/изменения в интерфейсе администрирования. По умолчанию всего три:

  • Сохраните и добавьте еще

  • Сохранить и продолжить редактирование

  • Сохранить

Я создал некоторые пользовательские методы в моем файле forms.py, и я хочу создать кнопки для вызова этих методов. Я использовал фрагмент http://djangosnippets.org/snippets/1842/, но это не совсем то, что я хочу. Это позволяет создавать кнопки и методы вызова из файла admin.py, а не forms.py.

Есть ли способ сделать это?

Это мой код admin.py:

class CategoryAdmin(admin.ModelAdmin):
    prepopulated_fields = { "alias": ("title",) }
    form = CategoryForm

admin.site.register(Category, CategoryAdmin)

И мой код forms.py,

class CategoryForm(forms.ModelForm):
    """
    My attributes
    """
    def custom_method(self):
        print("Hello, World!")

Как создать кнопку, которая вызывает "custom_method()"?

Ответы

Ответ 1

Вы можете переопределить admin/change_form.html. Скопируйте версию в contrib.admin.templates в свой проект. Mine myproject/templates/admin/change_form.html, но вы можете использовать /myproject/myapp/templates/admin/change_form.html.

Затем отредактируйте копию и измените две ссылки на существующий тег шаблона {% submit_row %}, чтобы указать на свой собственный тег шаблона, {% my_template_tag %}.

Настройте свой тег шаблона на contrib.admin {% submit_row %}, но отредактируйте шаблон HTML, чтобы он содержал дополнительные кнопки, которые вы хотите отобразить.

Ответ 2

Один простой способ добавить кнопки - добавить еще одну строку для пользовательских кнопок. Создайте каталог администратора в каталоге шаблонов, исходя из ваших потребностей. Например, я обычно добавляю кнопки для определенных моделей в пользовательский шаблон. Создайте каталог "templates/admin/app/model/".

Затем добавьте файл change_form.html.

{% extends "admin/change_form.html" %}
{% load i18n %}

{% block submit_buttons_bottom %}
    <div class="submit-row">
       <input type="button" value="{% trans 'Another Button' %}" name="_anotherbutton" />
    </div>

    {{ block.super }}
{% endblock %}

Код перед {{ block.super }} вдохновлен шаблоном submit_line.html, используемым тегом шаблона {% submit_row %}. Я предпочитаю этот метод, потому что он прост, но вы должны жить с другим рядом кнопок.

enter image description here

Ответ 3

Кнопки отправки в форме изменения отображаются тегом submit_row. Этот тег отображает шаблон admin/submit_line.html. Поскольку вы хотите добавить к существующим кнопкам, ваш лучший (и DRYest) подход состоит в переопределении admin/submit_line.html.

Например, создайте файл my_project/templates/admin/submit_line.html со следующим содержимым:

{% load i18n admin_urls %}
<div class="submit-row">
{% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" {{ onclick_attrib }}/>{% endif %}
{% if show_delete_link %}<p class="deletelink-box"><a href="{% url opts|admin_urlname:'delete' original.pk|admin_urlquote %}" class="deletelink">{% trans "Delete" %}</a></p>{% endif %}
{% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" {{ onclick_attrib }}/>{%endif%}
{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" {{ onclick_attrib }}/>{% endif %}
{% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" {{ onclick_attrib }}/>{% endif %}

<input type="submit" value="{% trans 'New button 1' %}" name="_button1" {{ onclick_attrib }}/>
<input type="submit" value="{% trans 'New button 2' %}" name="_button2" {{ onclick_attrib }}/>
</div>

Большая часть вышеперечисленного была скопирована из django/contrib/admin/templates/submit_line.html. Вы также можете добавить дополнительные выражения if в шаблон, если вы хотите показывать только эти дополнительные кнопки в определенных случаях.