Создание пользовательских кнопок в 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
в шаблон, если вы хотите показывать только эти дополнительные кнопки в определенных случаях.