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

Posted

技术标签:

【中文标题】扩展 Django 管理模板 - 更改更改列表【英文标题】:Extending Django Admin Templates - altering change list 【发布时间】:2011-06-15 05:41:41 【问题描述】:

关于扩展 django 管理模板的一个(不是那么)快速的问题。

我正在尝试通过在包含与该对象相关的一些对象的结果行(row1 和 row2 类)之间添加一个中间行来更改特定模型的结果列表(django lingo 中的更改列表)。

我搜索了代码,但没有找到执行此操作的方法。非常感谢任何指针。代码也会有所帮助。

PS:我知道我应该设计自己的界面,但这是一个内部项目,我没有那么多空闲时间。另外,django 的界面真的很不错。

提前谢谢你。

【问题讨论】:

admin.py 有一些函数可以帮助您覆盖常规方法...Check it out in here...它们可能会帮助您... 【参考方案1】:

第 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)

您可以看到管理员使用此admin/change_list_results.html 模板来呈现各个列,因此您需要使用其中一种方法来替换此模板标记。

因为它正在寻找一个全局模板,所以我不会覆盖它。

要么专门为您的视图定义一个带有新模板的新标签,要么直接将result_list(cl) 发送到您的模板并采用admin/change_list_results.html 直接在您的change_list.html 模板中使用。

【讨论】:

这就像一个魅力。我不得不稍微调试一下 result_list(cl) 中 cl 的属性。除此之外 - 非常感谢! :-)【参考方案2】:

为了扩展 Yuji 的答案,这里有一些关于覆盖 change_list_results.html 的细节......


覆盖changelist_view,如上文第 1 步所述,也描述了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的目录),文件对应上面的load标签

# 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>。)


附加

要包含额外的上下文,请按如下方式更改您的模板标签模块:

# 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

【讨论】:

我无法理解这个答案的结构! @Pranab 我敢打赌作者也无法理解你到底不明白什么......也许下次更明确一点会有所帮助:)【参考方案3】:

如果您想要完全覆盖 admin_list 模板标签,这是我在另一个线程中的帖子。 https://***.com/a/55597294/11335685

我知道它与change_list 模板没有直接关系,但它的逻辑在于admin_list 模板标签内的函数。

这种方法的一个缺点是我没有找到一种仅覆盖特定功能并使用其他功能的方法。

这仍然是唯一能让我不弄乱 html 模板并且只改变 result_list 函数的行为的方法。

希望对任何人都有帮助。

【讨论】:

以上是关于扩展 Django 管理模板 - 更改更改列表的主要内容,如果未能解决你的问题,请参考以下文章

无法更改 Django 管理模板

Django admin - 在显示的用户列表中添加一个字段

django 管理界面 - 如何在更改列表视图中折叠/展开对象详细信息?

在 django 管理更改列表页面上的每条记录上添加按钮?

python Django:向管理员更改列表视图添加自定义按钮

如何从 django 管理站点中删除更改密码链接?