其他字段显示在admin change_list视图中的表外

时间:2019-02-18 11:01:48

标签: django django-templates

我在管理站点注册的名为Project的应用程序中有一个名为projects的模型,因此可以添加/编辑实例等。这按预期工作。现在,我想在管理站点的更改列表视图中为每个项目添加一个按钮,该按钮链接到需要Project实例才能执行操作的自定义表单。我遵循了许多不同的教程来自定义管理站点,并设法在更改列表视图的表中添加了另一个字段。但是,这些条目显示在表的外部(参见图片)。 Broken table format of admin change list view

我通过覆盖admin/change_list.html模板并在其中调用自定义模板标签custom_result_list来添加自定义字段。此标记将一个表字段添加到更改列表,然后调用admin/change_list_results.html模板来呈现它。我已通过调试器确认,在呈现模板之前,该项目已添加到更改列表的条目中(参见图片)。list of variables in a debug window

即使附加字段的结构与自动生成的字段相同,我也无法解释为什么表格无法正确呈现。我不得不承认我求助于“货物崇拜”编程,因为尽管花了很多时间试图解决这个简单的问题,但我仍不明白这应该如何工作。

这是相关的代码。

在文件/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 %}

1 个答案:

答案 0 :(得分:1)

要解决您的问题,

from django.utils.html import format_html

snippet.format(...)替换为format_html(snippet,...)

说明:

在django中,您从python传递的所有字符串都会自动转义为HTML。这意味着您的所有标签都不会被视为HTML。添加此限制是为了避免黑客进行任何潜在的利用。在您的情况下,强烈建议您使用模板来呈现html。但是,您也可以使用format_html帮助函数从python发送原始html。