Я думал по любой причине, которую это будет легко сделать, но я выглядел глубже, и кажется, что нет никакого простого способа позволить пользователям выполнять пользовательские администраторские действия с представлением "изменения" экземпляра (т.е. когда Вы просто просматриваете экран редактирования для единственного экземпляра, не список экземпляров).
Я пропускаю простой способ сделать это? Или мой единственный выбор переопределить один из администраторских шаблонов (и вероятно ModelAdmin.add_view
метод)?
Вот что я в итоге сделал.
Во-первых, я расширил change_view объекта ModelAdmin следующим образом:
def change_view(self, request, object_id, extra_context=None):
actions = self.get_actions(request)
if actions:
action_form = self.action_form(auto_id=None)
action_form.fields['action'].choices = self.get_action_choices(request)
else:
action_form = None
changelist_url = urlresolvers.reverse('admin:checkout_order_changelist')
return super(OrderAdmin, self).change_view(request, object_id, extra_context={
'action_form': action_form,
'changelist_url': changelist_url
})
В основном мы просто собираем данные, необходимые для заполнения раскрывающегося списка действий в представлении изменений.
Затем я просто расширил файл change_form.html для рассматриваемой модели:
{% extends "admin/change_form.html" %}
{% load i18n adminmedia admin_list %}
{% block extrastyle %}
{{ block.super }}
<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/changelists.css" />
{% endblock %}
{% block object-tools %}
{{ block.super }}
<div id="changelist">
<form action="{{ changelist_url }}" method="POST">{% csrf_token %}
{% admin_actions %}
<input type="hidden" name="_selected_action" value="{{ object_id }}">
</form>
</div>
{% endblock %}
Это почти идентично тому, как раздел действий администратора выводится в представлении списка изменений. Основные отличия заключаются в следующем: 1) мне нужно было указать URL-адрес формы для публикации, 2) вместо флажка, чтобы указать, какой объект (-ы) следует изменить, значение устанавливается через скрытое поле формы и 3) Я включил CSS для просмотра списка изменений и вставил действия в div с идентификатором #changelist
- просто чтобы окно выглядело наполовину прилично.
Не самое лучшее решение, но оно работает нормально и не требует дополнительной настройки для дополнительных действий, которые вы могли бы добавить.
Я создал свой собственный шаблон MYAPP/templates/admin/MYMODEL/change_form.html:
{% extends "admin/change_form.html" %}
{% load i18n %}
{% block object-tools %}
{% if change %}{% if not is_popup %}
<ul class="object-tools">
<li><a href="{% url MY_COMMAND_VIEW original.id %}" class="historylink" >MY COMMAND</a></li>
<li><a href="history/" class="historylink">{% trans "History" %}</a></li>
{% if has_absolute_url %}<li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif%}
</ul>
{% endif %}{% endif %}
{% endblock %}
Таким образом, я изменил только блок "object-tools", где находится ссылка history и ссылка "view on site". Остальная часть оригинального change_form.html осталась нетронутой. BTW: "original.id" - это id модели, которую вы редактируете.