gue*_*tli 10 django django-admin
我的django管理界面如下所示:
现在,我想添加一个与模型不对应的视图。
我可以覆盖以上页面的模板并添加自定义链接。但是我认为这看起来很丑。
覆盖示例admin/index.html:
{% extends "admin/index.html" %}
{% block content %}
{{ block.super }}
<div class="app-sonstiges module">
....
</div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
但是,也许有一种官方方法可以向管理界面添加自定义视图?
就我而言,我想提供一个可以执行tcptraceroute到远程服务器的表格。我的应用程序的管理员需要这个。
我使用了相同的html标签。现在,链接“ tcptraceroute”看起来不错,但不幸的是消息已向下移动:
有没有办法像屏幕快照中那样获得自定义部件,例如“ Sontiges ... tcptraceroute”,而无需向下移动最新动作?
这是html结构的样子。我<div class="app-sonstiges">在content-main下面:
这里的问题是你div不在里面main-content。我建议扩展admin/index.html
放入 app/templates/admin/index.html
{% extends "admin/index.html" %}
{% load i18n static %}
{% block content %}
<div id="content-main">
{% if app_list %}
{% for app in app_list %}
<div class="app-{{ app.app_label }} module">
<table>
<caption>
<a href="{{ app.app_url }}" class="section" title="{% blocktrans with name=app.name %}Models in the {{ name }} application{% endblocktrans %}">{{ app.name }}</a>
</caption>
{% for model in app.models %}
<tr class="model-{{ model.object_name|lower }}">
{% if model.admin_url %}
<th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
{% else %}
<th scope="row">{{ model.name }}</th>
{% endif %}
{% if model.add_url %}
<td><a href="{{ model.add_url }}" class="addlink">{% trans 'Add' %}</a></td>
{% else %}
<td> </td>
{% endif %}
{% if model.admin_url %}
{% if model.view_only %}
<td><a href="{{ model.admin_url }}" class="viewlink">{% trans 'View' %}</a></td>
{% else %}
<td><a href="{{ model.admin_url }}" class="changelink">{% trans 'Change' %}</a></td>
{% endif %}
{% else %}
<td> </td>
{% endif %}
</tr>
{% endfor %}
</table>
</div>
{% endfor %}
<!-- here you could put your div -->
<div class="app-sonstiges module">
....
</div>
<!-- here you could put your div -->
{% else %}
<p>{% trans "You don't have permission to view or edit anything." %}</p>
{% endif %}
</div>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
另一种方法是向中添加自定义应用app_list。但这要丑得多。所以我建议覆盖模板。
我假设你是覆盖get_urls在AdminSite。
您在这里有3个选择:
这很简单,有一些不错的软件包,支持admin菜单,以及一些将项目添加到菜单的方法。
第三方套餐的示例为django-admin-tools。缺点是它很难学习。另一个选择是使用,django-adminplus但在撰写本文时,它不支持Django 2.2。
您可以随时扩展管理模板并覆盖所需的部分,如@Sardorbek答案中所述,您可以从管理模板中复制某些部分并以所需的方式更改它们。
如果您的视图只应在管理站点上执行,则可以扩展adminsite(并可以更改默认值),除了将链接添加到模板之外,还应使用此方法定义仅管理视图,因为这样更易于检查这样的权限。
考虑到您已经扩展了adminsite,现在您可以使用以前的方法将链接添加到模板,甚至可以扩展get_app_list方法,例如:
class MyAdminSite(admin.AdminSite):
def get_app_list(self, request):
app_list = super().get_app_list(request)
app_list += [
{
"name": "My Custom App",
"app_label": "my_test_app",
# "app_url": "/admin/test_view",
"models": [
{
"name": "tcptraceroute",
"object_name": "tcptraceroute",
"admin_url": "/admin/test_view",
"view_only": True,
}
],
}
]
return app_list
Run Code Online (Sandbox Code Playgroud)
在向他们显示链接之前,您还可以检查当前职员用户是否可以访问模块。然后在结尾处看起来像这样:

| 归档时间: |
|
| 查看次数: |
547 次 |
| 最近记录: |