我的django管理界面如下:
现在,我想添加一个与模型不对应的视图。
我可以覆盖以上页面的模板并添加自定义链接。但是我认为这看起来很丑。
覆盖admin/index.html
的示例:
{% extends "admin/index.html" %}
{% block content %}
{{ block.super }}
<a href="....">....</a>
{% endblock %}
但是也许有一种官方方法可以向管理界面添加自定义视图?
就我而言,我想提供一个可以对远程服务器执行tcptraceroute
的表单。我的应用程序的管理员需要这个。
我使用了相同的html标签。现在,链接“ tcptraceroute”看起来不错,但是不幸的是消息向下移动:
有没有办法像屏幕快照中那样获得自定义部件,例如“ Sontiges ... tcptraceroute”,而无需向下移动最新动作?
答案 0 :(得分:5)
这里的问题是您的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 %}
另一种方法是将自定义应用添加到app_list
。但这要丑得多。所以我建议覆盖模板。
我假设您要在get_urls
中覆盖AdminSite
。
答案 1 :(得分:5)
您在这里有3个选择:
这很简单,有一些不错的软件包,它们支持admin菜单,以及一些将项目添加到菜单的方法。
您可以随时扩展管理模板并覆盖所需的部分,如@Sardorbek答复中所述,您可以从管理模板中复制某些部分并以所需的方式更改它们。
如果您的视图只应在管理网站上执行,则可以扩展adminsite(也许是change the default),除了向模板添加链接之外,还应使用此方法将仅管理视图定义为这样更容易检查权限。
考虑到您已经扩展了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