У меня есть модель с именем Project
в приложении под названием projects
, которое я зарегистрировал на сайте администратора, чтобы экземпляры можно было добавлять / редактировать / и т.д.Это работает как ожидалось.Теперь я хочу добавить кнопку для каждого проекта в представлении списка изменений на сайте администратора, которая ссылается на пользовательскую форму, для выполнения которой требуется экземпляр Project
.Я выполнил кучу разных уроков по настройке сайта администратора и сумел добавить еще одно поле в таблицу представления списка изменений.Однако записи отображаются вне таблицы (см. Изображение).
Я добавил пользовательское поле, переписав шаблон admin/change_list.html
и вызвав внутри него тег пользовательского шаблона custom_result_list
.Этот тег добавляет поле таблицы в список изменений и затем вызывает шаблон admin/change_list_results.html
, чтобы отобразить его.Я подтвердил с помощью отладчика, что элемент добавляется в записи списка изменений до отображения шаблона (см. Изображение).
Я не могу объяснить, почему таблицане отображается правильно, хотя дополнительное поле имеет ту же структуру, что и автоматически сгенерированные.Я должен признать, что прибегал к программированию Cargo Cult, потому что я не понимаю, как это должно работать, несмотря на то, что трачу слишком много времени на решение этой простой проблемы.
Вот соответствующий код.
В файле /projects/templatetags/custom_admin_tags.py
:
from django import template
from django.contrib.admin.templatetags.admin_list import result_list as admin_result_list
def custom_result_list(chl):
extended_cl = {}
extended_cl.update(admin_result_list(chl))
extended_cl["result_headers"].append({
'class_attrib': r' class="column-__str__"',
'sortable': False,
'text': 'Configure Project'
})
idx = 0
snippet = '<td class="action-button"><a href="/admin/projects/project_admin/{}">{}</a></td>'
for project in chl.result_list:
extended_cl["results"][idx].append(snippet.format(project.id, project.unmod_name))
idx += 1
return extended_cl
register = template.Library()
register.inclusion_tag('admin/change_list_results.html')(custom_result_list)
В файле templates/admin/projects/project/change_list.html
:
{% extends "admin/change_list.html" %}
{% load i18n admin_urls static admin_list %}
{% load custom_admin_tags %}
{% block result_list %}
{% if action_form and actions_on_top and cl.show_admin_actions %}{% admin_actions %}{% endif %}
{% custom_result_list cl %}
{% if action_form and actions_on_bottom and cl.show_admin_actions %}{% admin_actions %}{% endif %}
{% endblock %}