关于扩展django管理模板的一个(不那么)快速问题。
我正在尝试通过在包含与该对象相关的一些对象的结果行(row1和row2类)之间添加中间行来更改特定模型的结果列表(django lingo中的更改列表)。
我搜索了代码,但还没有找到办法。任何指针都非常感激。代码也会有所帮助。
PS:我知道我应该设计自己的界面,但这是一个内部项目,我没有那么多时间。此外,django界面非常好。
提前谢谢。
答案 0 :(得分:34)
为了扩展Yuji的答案,以下是有关覆盖change_list_results.html
的一些细节......
如上文步骤1中所述覆盖changelist_view
,并且还描述了here at djangoproject。 或 通过放置在上面的步骤2中的相应目录中进行自动覆盖。 (请注意,上面显示的第2步路径是特定于模型的。在TEMPLATE_DIRS元组中定义的任何目录下,特定于应用的应用程序为/admin/<MyAppName>/change_list.html
。)
或 (可能更简单)只需使用任何可发现的模板文件名指定ModelAdmin.change_list_template
,如here所述。 (但是,如果保留名称change_list.html
,请确保不要直接存入/admin
文件夹,否则extends
标记将导致递归。)
class MyModelAdmin(admin.ModelAdmin):
change_list_template = 'change_list.html' # definitely not 'admin/change_list.html'
# ...
在change_list.html
模板中,至少
{% extends "admin/change_list.html" %}
{% load i18n admin_static admin_list %}
{% load myapptags %}
{% block result_list %}
{% if action_form and actions_on_top and cl.full_result_count %}{% admin_actions %}{% endif %}
{% result_list cl %}
{% if action_form and actions_on_bottom and cl.full_result_count %}{% admin_actions %}{% endif %}
{% endblock %}
创建一个/<MyAppName>/templatetags
包(包含__init__.py
的目录),其中包含与上面的加载标记相对应的文件
# MyAppName/templatetags/myapptags.py
from django import template
from django.contrib.admin.templatetags.admin_list import result_list
register = template.Library()
register.inclusion_tag('my_change_list_results.html')(result_list)
复制并编辑Django的change_list_results.html
(例如上面的my_change_list_results.html
)以使用您添加的功能。
请注意,这些步骤不包含模板的额外上下文,但可以轻松扩展。 (我这样做的原因是为CSS添加了一个类和一个未按结果列表排序的前导<tbody>
。)
其他强>:
要包含额外的上下文,请按以下步骤更改templatetags模块:
# MyAppName/templatetags/myapptags.py
from django import template
from django.contrib.admin.templatetags.admin_list import result_list as admin_list_result_list
def result_list(cl):
mycl = {'myextracontext': 'something extra'}
mycl.update(foo_extra())
mycl.update(admin_list_result_list(cl))
return mycl
register = template.Library()
register.inclusion_tag('my_change_list_results.html')(result_list)
然后,myextracontext
或任何foo_extra
返回的值可以包含在结果模板中(例如{{ myextracontext }}
)
答案 1 :(得分:31)
第1步:覆盖更改列表视图:
您必须覆盖模板,而不是像add_view / change_view
那样指定模板。
首先,首先,覆盖
def changelist_view(self, request, extra_context=None):
中的ModelAdmin
。请记得致电super(foo, self).changelist_view(request, extra_context)
并返回。
第2步:覆盖模板:
接下来,在templates/admin/my_app/my_model/change_list.html
覆盖特定于应用程序的更改列表模板(或者不是..如果您愿意,也可以使用全局更改列表覆盖)。
第3步:复制结果列表功能
我认为你可以复制result_list
功能(定义一个新的模板标签),也可以通过将result_list函数和模板include复制并粘贴到视图中来伪造它。
# django.contrib.admin.templatetags.admin_list
def result_list(cl):
"""
Displays the headers and data list together
"""
return {'cl': cl,
'result_hidden_fields': list(result_hidden_fields(cl)),
'result_headers': list(result_headers(cl)),
'results': list(results(cl))}
result_list = register.inclusion_tag("admin/change_list_results.html")(result_list)
您可以看到管理员使用此admin/change_list_results.html
模板呈现单个列,因此您需要使用其中一种方法来替换此模板标记。
由于它正在寻找全局模板,我不会覆盖它。
为视图定义具有新模板的新标记,或直接将result_list(cl)
发送到您的模板,并直接在admin/change_list_results.html
模板中使用change_list.html
。
答案 2 :(得分:0)
如果您想完全覆盖admin_list
模板标签,这是我在另一个主题中的帖子。 https://stackoverflow.com/a/55597294/11335685
我知道它与change_list
模板没有直接关系,但是其逻辑取决于admin_list
模板标记中的功能。
该方法的缺点是我没有找到一种方法来仅重写特定功能并利用其他功能。
这仍然是唯一允许我不弄乱html模板并仅更改result_list
函数行为的方法。
希望对任何人都有帮助。