Как добавить пользовательский вид в интерфейс администратора django? - PullRequest
9 голосов
/ 22 мая 2019

Мой интерфейс администратора django выглядит следующим образом:

django-admin

Теперь я хотел бы добавить представление, которое не соответствует модели.

Я мог бы перезаписать шаблон вышеупомянутой страницы и добавить пользовательскую ссылку.Но я думаю, это выглядело бы ужасно.

Пример для перезаписи admin/index.html:

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

{% block content %}

{{ block.super }}
<div class="app-sonstiges module">
   ....
</div>
{% endblock %}

Но, может быть, есть официальный способ добавить пользовательский вид в интерфейс администратора?

В моем случае я хочу предоставить форму, которая может выполнять tcptraceroute для удаленного сервера.Администратор моего приложения нуждается в этом.

Я использовал те же HTML-теги.Теперь ссылка "tcptraceroute" выглядит красиво, но, к сожалению, сообщения переместились вниз:

newest-actions-moved-down

Есть ли способ получить пользовательскую часть, такую ​​как "Sontiges"."tcptraceroute", как на скриншоте, без перемещения последних действий вниз?

Вот как выглядит html-структура.Мой <div class="app-sonstiges"> ниже основного содержимого:

my-part-after-content-main

Ответы [ 2 ]

5 голосов
/ 06 июня 2019

У вас есть 3 варианта здесь:

Использование сторонних пакетов, предоставляющих меню

Это довольно просто, есть несколько хороших пакетов, которые поддерживают меню для администратора и способ добавить ваш элемент в меню.

Взлом с помощью шаблонов администрирования django

Вы всегда можете расширить шаблоны администратора и переопределить нужные части, как уже упоминалось в ответе @Sardorbek, вы можете скопировать некоторые части из шаблона администратора и изменить их так, как вы хотите.

Использование пользовательского сайта администратора

Если ваши представления должны действовать только на сайте администратора, вы можете расширить админсайт (и, возможно, изменить значение по умолчанию ), помимо добавления ссылок на шаблон, вы должны использовать этот метод для определения вашего администратора -просматривает только потому, что так проще проверять разрешения.

Учитывая, что вы уже расширили административный сайт, теперь вы можете использовать предыдущие методы, чтобы добавить ссылку на шаблон, или даже расширить 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

5 голосов
/ 04 июня 2019

Проблема здесь в том, что ваш 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.

...