我正在寻找解决方案。我想很多不同的例子让我有点困惑。我想覆盖 Django 管理员中的对象工具模板。
我的模型工具上有一个按钮:
我需要另一种相同类型的按钮“上传文件”。这应该将我重定向到我想在同一个管理基本模板中自己设计的另一个视图(只有一个上传文件控件)。
我正在寻找解决方案。我想很多不同的例子让我有点困惑。我想覆盖 Django 管理员中的对象工具模板。
我的模型工具上有一个按钮:
我需要另一种相同类型的按钮“上传文件”。这应该将我重定向到我想在同一个管理基本模板中自己设计的另一个视图(只有一个上传文件控件)。
[一个]
移动"django.contrib.admin"
到你INSTALLED_APPS
的末尾INSTALLED_APPS
。
您可以制作模板文件
<your_app>/templates/admin/<your_app>/<your_model>/change_list.html
源代码:
{% extends "admin/change_list.html" %}
{% block object-tools-items %}
<li>
<a href="<your-action-url>" class="addlink">
Upload file
</a>
</li>
{{ block.super }}
{% endblock %}
[乙]
添加change_list_template
到您的 ModelAdmin。
class MyModelAdmin(admin.ModelAdmin):
change_list_template = '<path-to-my-template>.html'
并像[A]源代码那样编写模板。
自从第一次提出这个问题以来,完成您正在寻找的内容变得更加容易。
Django 文档有一节介绍如何覆盖管理模板。要将按钮添加到更改列表对象工具,请执行以下步骤:
将 Django 版本的change_list_object_tools.html
模板文件复制到项目或应用程序的模板文件夹中:templates/admin/<app>/<model>/change_list_object_tools.html
.
您可以从虚拟环境的site-packages
文件夹中获取文件:
cp $VIRTUAL_ENV/lib/python3.8/site-packages/django/contrib/admin/templates/admin/change_list_tools.html templates/admin/$APP/$MODEL/
请注意,您可能需要site-packages
为您的 Python 版本调整路径。
现在打开模板文件。它看起来像这样:
{% load i18n admin_urls %}
{% block object-tools-items %}
{% if has_add_permission %}
<li>
{% url cl.opts|admin_urlname:'add' as add_url %}
<a href="{% add_preserved_filters add_url is_popup to_field %}" class="addlink">
{% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %}
</a>
</li>
{% endif %}
{% endblock %}
将链接添加到您的自定义视图:
…
{% if has_add_permission %}
<li><a class="addlink" href="{% url 'upload-file' %}">Upload file</a></li>
<li>
…
而已!如果您不知道:您可以使用ModelAdmin.get_urls()
( docs ) 将自定义视图和 URL 添加到 ModelAdmin。为了不必对您的自定义管理 URL 进行硬编码,您当然可以反转它们(文档)。
您可以尝试使用https://github.com/texastribune/django-object-actions。
这将允许您添加具有自定义逻辑的按钮。
不过,我不确定您是否可以为列表屏幕设置按钮,因为我只为模型编辑页面这样做。