Существует ли способ заставить пользовательские администраторские действия Django появляться на представлении “изменения” в дополнение к “представлению” списка изменения?

Я думал по любой причине, которую это будет легко сделать, но я выглядел глубже, и кажется, что нет никакого простого способа позволить пользователям выполнять пользовательские администраторские действия с представлением "изменения" экземпляра (т.е. когда Вы просто просматриваете экран редактирования для единственного экземпляра, не список экземпляров).

Я пропускаю простой способ сделать это? Или мой единственный выбор переопределить один из администраторских шаблонов (и вероятно ModelAdmin.add_view метод)?

33
задан jsdalton 10 May 2010 в 19:16
поделиться

2 ответа

Вот что я в итоге сделал.

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

Не самое лучшее решение, но оно работает нормально и не требует дополнительной настройки для дополнительных действий, которые вы могли бы добавить.

10
ответ дан 27 November 2019 в 19:30
поделиться

Я создал свой собственный шаблон 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 модели, которую вы редактируете.

2
ответ дан 27 November 2019 в 19:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: