Как добавить пользовательский вид в интерфейс администратора django?

Мой интерфейс администратора django выглядит так:

django-admin

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

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

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

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

{% block content %}

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

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

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

Я использовал те же html-теги. Теперь ссылка «tcptracoute» выглядит красиво, но, к сожалению, сообщения сдвинулись вниз:

newest-actions-moved-down

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

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

my-part-after-content-main

Этого не должно быть. Вы уверены, что не забыли закрыть какой-то тег в HTML-фрагменте, добавленном в index.html?

Mario Orlandi 04.06.2019 10:24

@MarioOrlandi моя часть (<div class="app-sonstiges module">...<div>) после, а не внутри «контента-основного». Я не думаю, что в моем html есть опечатка

guettli 04.06.2019 10:45

ммхх, я вижу ... вы можете попробовать добавить некоторые стили css в ".app-sonstiges", чтобы разместить его слева

Mario Orlandi 04.06.2019 13:47
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
17
3
7 618
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Проблема в том, что твоего div нет внутри main-content. Предлагаю продлить 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/templates/admin/index.html. Но это куда более уродливо. Поэтому я предлагаю переопределить template.

Я предполагаю, что вы переопределяете app_list в get_urls.

Ответ принят как подходящий

Здесь у вас есть 3 варианта:

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

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

Примером стороннего пакета может быть django-admin-tools. Недостатком является то, что это немного трудно учиться. Другой вариант — использовать django-adminplus, но на момент написания этой статьи он не поддерживал Django 2.2.

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

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

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

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

Хороший ответ, спасибо! Какой сторонний пакет для администратора django вы рекомендуете?

guettli 06.06.2019 14:15

@guettli, это зависит от того, что вы ожидаете от этого пакета, django-admin-tools хорош, и он сохраняет внешний вид django по умолчанию, но его трудно освоить, также требуется небольшая хитрость для работы с django 2.2 прямо сейчас ( одно решение, упомянутое в проблемах), django-suit проще настроить, но его тема немного устарела (новая версия находится в разработке), вы также можете использовать django-admin-bootstrap, который поддерживает боковое меню, но вам нужно использовать третий вариант из моего ответа, чтобы добавить новый пункт меню (я не проверял, но он должен работать)

Pooya Mobasher Behrooz 06.06.2019 15:08

@PooyaMobasherBehrooz Я бы добавил эти детали к вашему ответу, это наверняка сделает его более полным.

trinchet 06.06.2019 15:55

Если вам нужна пользовательская страница для обработки пользовательского ввода (из формы), вы можете попробовать джанго-и т. д. 1.3.0+:

    from etc.admin import CustomModelPage

    class MyPage(CustomModelPage):
    
        title = 'My custom page'  # set page title

        # Define some fields you want to proccess data from.
        my_field = models.CharField('some title', max_length=10)

        def save(self):
            # Here implement data handling.
            super().save()

    # Register the page within Django admin.
    MyPage.register()

Другие вопросы по теме