Подтвердить что ты не робот

Как создать пользовательскую страницу для администратора django?

Я хочу создать пользовательскую страницу для панели администратора без модели. Для первого я скопируйте index.html в папку проекта:

mysite/
    templates/
        admin/
            index.html

Затем добавьте в приложения блокировать мой код:

<div class="module">
    <table summary="{% blocktrans with name="preferences" %}Models available in the preferences application.{% endblocktrans %}">
        <caption><a href="preferences" class="section">{% blocktrans with name="preferences" %}Preferences{% endblocktrans %}</a></caption>
            <tr>
                <th scope="row"><a href="preferences">Preferences</a></th>
                <td><a href="preferences" class="changelink">{% trans 'Change' %}</a></td>
            </tr>
    </table>
</div>

Это хорошо работает, тогда я создаю новую страницу /templates/admin/preferences/preferences.html и добавить в urls.py:

url(r'^admin/preferences/$', TemplateView.as_view(template_name='admin/preferences/preferences.html')),

И добавьте код в preferences.html:

{% extends "admin/base_site.html" %}
{% block title %}Test page{% endblock %}

Запустить его и увидеть сообщение с ошибкой "Запрошенная страница администратора не существует". Что я делаю неправильно?

4b9b3361

Ответ 1

Вам нужно добавить URL-адрес администратора перед шаблонами URL-адреса самого администратора:

urlpatterns = patterns('',
   url(r'^admin/preferences/$', TemplateView.as_view(template_name='admin/preferences/preferences.html')),
   url(r'^admin/', include('django.contrib.admin.urls')),
)

Таким образом, URL-адрес не будет обрабатываться администратором Django.

Ответ 2

Вы должны использовать admin get_urls.

Ответ 3

Здесь приведен пример всего, что должно быть необходимо (с Django 1.6) для настраиваемой страницы администрирования, которая связана с кнопкой рядом с кнопкой "История" в правом верхнем углу страницы подробных сведений о объекте:

https://gist.github.com/mattlong/4b64212e096766e058b7

Ответ 4

Проходят годы, и все еще можно опубликовать соответствующий ответ.

Используя Django 1. 10+ вы можете сделать:

security/admin.py (это файл администратора вашего приложения)

from django.contrib import admin
from django.conf.urls import url
from django.template.response import TemplateResponse
from security.models import Security


@admin.register(Security)
class SecurityAdmin(admin.ModelAdmin):

    def get_urls(self):

        # get the default urls
        urls = super(SecurityAdmin, self).get_urls()

        # define security urls
        security_urls = [
            url(r'^configuration/$', self.admin_site.admin_view(self.security_configuration))
            # Add here more urls if you want following same logic
        ]

        # Make sure here you place your added urls first than the admin default urls
        return security_urls + urls

    # Your view definition fn
    def security_configuration(self, request):
        context = dict(
            self.admin_site.each_context(request), # Include common variables for rendering the admin template.
            something="test",
        )
        return TemplateResponse(request, "configuration.html", context)

безопасность/шаблоны/configuration.html

{% extends "admin/base_site.html" %}
{% block content %}
...
{% endblock %}

См. Официальное описание ModelAdmin.get_urls (убедитесь, что вы выбрали правильную версию Django, этот код действителен для 1.10 и выше)

Обратите внимание на использование get_urls() выше. Эта новая страница администратора будет доступна по адресу: http (s)://: <8000>/admin/security/configuration/Эта страница будет защищена в области входа администратора.

Ответ 5

Полный пример:

from django.conf.urls import url
from django.contrib import admin
from django.db import models

class DummyModel(models.Model):
    class Meta:
        verbose_name = 'Link to my shiny custom view'
        app_label = 'users'  # or another app to put your custom view

@admin.register(DummyModel)
class DummyModelAdmin(admin.ModelAdmin):
    def get_urls(self):
        view_name = '{}_{}_changelist'.format(
                DummyModel._meta.app_label, DummyModel._meta.model_name)
        return [
            url(r'^my_view/$', MyCustomView.as_view(), name=view_name)
        ]