我在管理站点注册的名为Project
的应用程序中有一个名为projects
的模型,因此可以添加/编辑实例等。这按预期工作。现在,我想在管理站点的更改列表视图中为每个项目添加一个按钮,该按钮链接到需要Project
实例才能执行操作的自定义表单。我遵循了许多不同的教程来自定义管理站点,并设法在更改列表视图的表中添加了另一个字段。但是,这些条目显示在表的外部(参见图片)。
我通过覆盖admin/change_list.html
模板并在其中调用自定义模板标签custom_result_list
来添加自定义字段。此标记将一个表字段添加到更改列表,然后调用admin/change_list_results.html
模板来呈现它。我已通过调试器确认,在呈现模板之前,该项目已添加到更改列表的条目中(参见图片)。
即使附加字段的结构与自动生成的字段相同,我也无法解释为什么表格无法正确呈现。我不得不承认我求助于“货物崇拜”编程,因为尽管花了很多时间试图解决这个简单的问题,但我仍不明白这应该如何工作。
这是相关的代码。
在文件/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 %}
答案 0 :(得分:1)
from django.utils.html import format_html
将snippet.format(...)
替换为format_html(snippet,...)
在django中,您从python传递的所有字符串都会自动转义为HTML。这意味着您的所有标签都不会被视为HTML。添加此限制是为了避免黑客进行任何潜在的利用。在您的情况下,强烈建议您使用模板来呈现html。但是,您也可以使用format_html帮助函数从python发送原始html。