rsa*_*avu 23 django django-admin
关于扩展django管理模板的一个(不那么)快速问题.
我试图通过在包含与该对象相关的一些对象的结果行(row1和row2类)之间添加中间行来更改特定模型的结果列表(django lingo中的更改列表).
我搜索了代码,但还没有找到办法.任何指针都非常感激.代码也会有所帮助.
PS:我知道我应该设计自己的界面,但这是一个内部项目,我没有那么多时间.此外,django界面非常好.
先感谢您.
Fra*_*ank 35
为了扩展Yuji的答案,这里有一些关于覆盖的具体内容change_list_results.html......
changelist_view如上所述在步骤1中进行覆盖,并且还在djangoproject中进行了描述.或者通过放置在上面的步骤2中的相应目录中进行自动覆盖.(请注意,上面显示的第2步路径是特定于模型的.特定于应用程序将/admin/<MyAppName>/change_list.html位于TEMPLATE_DIRS元组中定义的任何目录下.)
或者(可能更简单)只需在此处ModelAdmin.change_list_template说明任何可发现的模板文件名.(虽然,如果保留名称,请确保不要直接存入文件夹,否则标记将导致递归.)change_list.html/adminextends
class MyModelAdmin(admin.ModelAdmin):
change_list_template = 'change_list.html' # definitely not 'admin/change_list.html'
# ...
Run Code Online (Sandbox Code Playgroud)
在您的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 %}
Run Code Online (Sandbox Code Playgroud)
使用与上面的load标记对应的文件创建一个/<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)
Run Code Online (Sandbox Code Playgroud)
复制和编辑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)
Run Code Online (Sandbox Code Playgroud)
然后,结果模板中可以包含返回值myextracontext或任何foo_extra返回值(例如{{ myextracontext }})
Yuj*_*ita 33
第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函数和模板包含复制并粘贴到视图中来伪造它.
# 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)
Run Code Online (Sandbox Code Playgroud)
您可以看到管理员使用此admin/change_list_results.html模板呈现单个列,因此您需要使用其中一种方法来替换此模板标记.
由于它正在寻找全局模板,我不会覆盖它.
要么专门为您的视图定义带有新模板的新标记,要么result_list(cl)直接发送到您的模板并admin/change_list_results.html直接在change_list.html模板中使用.
| 归档时间: |
|
| 查看次数: |
26630 次 |
| 最近记录: |