如何将自定义视图添加到Django管理界面?

时间:2019-05-22 10:20:28

标签: django django-admin

我的django管理界面如下:

django-admin

现在,我想添加一个与模型不对应的视图。

我可以覆盖以上页面的模板并添加自定义链接。但是我认为这看起来很丑。

覆盖admin/index.html的示例:

{% extends "admin/index.html" %}

{% block content %}

{{ block.super }}
<a href="....">....</a>
{% endblock %}

但是也许有一种官方方法可以向管理界面添加自定义视图?

就我而言,我想提供一个可以对远程服务器执行tcptraceroute的表单。我的应用程序的管理员需要这个。

我使用了相同的html标签。现在,链接“ tcptraceroute”看起来不错,但是不幸的是消息向下移动:

newest-actions-moved-down

有没有办法像屏幕快照中那样获得自定义部件,例如“ Sontiges ... tcptraceroute”,而无需向下移动最新动作?

2 个答案:

答案 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>&nbsp;</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>&nbsp;</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菜单,以及一些将项目添加到菜单的方法。

使用django管理模板进行黑客攻击

您可以随时扩展管理模板并覆盖所需的部分,如@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

在向他们显示链接之前,您还可以检查当前职员用户是否可以访问模块。 然后在结尾处看起来像这样: enter image description here

相关问题