扩展Django管理模板 - 更改更改列表

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模板中使用.