44

我想为没有模型的管理面板创建自定义页面。首先,我将 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 %}

运行它并查看错误消息“请求的管理页面不存在。”。我做错了什么?

4

7 回答 7

35

您需要在管理员本身的 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 的管理员处理。

于 2012-04-07T11:41:06.460 回答
18

多年过去了,仍然可以发布一个相关的答案。

使用 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 有效)

于 2018-10-31T14:17:41.770 回答
12

您应该使用管理员的get_urls

于 2012-11-11T23:04:51.447 回答
5

这是一个自定义管理页面应该需要的一切示例(从 Django 1.6 开始),该页面从对象详细信息页面右上角的“历史记录”按钮旁边的按钮链接到:

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

于 2014-09-19T20:16:34.410 回答
4

完整示例:

from django.urls import path
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 [
            path('my_view/', MyCustomView.as_view(), name=view_name)
        ]

使用这种方法,Django 的makemigrations命令将创建 DB 迁移来为 DummyModel 创建表。

于 2018-03-18T09:02:33.347 回答
4

如果你想创建一个自定义页面只是为了放置一个任意表单来处理用户输入,你可以试试django-etc 。etc.admin.CustomModelPage你可以使用:

    # admin.py
    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()
于 2021-01-15T02:43:32.027 回答
0

根据django 的文档,扩展AdminSite课程对我来说效果最好。此解决方案保护管理站点登录机制下的页面,并且设置它比看起来更容易:

  1. 如果您有其他管理代码(例如myapp/admin.py),请扩展默认类:
from django.contrib.admin import AdminSite

class CustomAdminSite(AdminSite):

    def get_urls(self):
        custom_urls = [
            path('admin/preferences/', self.admin_view(views.my_view)),
        ]
        admin_urls = super().get_urls()
        return custom_urls + admin_urls  # custom urls must be at the beginning


site = CustomAdminSite()

# you can register your models on this site object as usual, if needed
site.register(Model, ModelAdmin)
  1. 实现视图
def my_view(request):
    return render(request, 'admin/preferences/preferences.html')
  1. 在 中使用该管理站点urls.py,而不是默认站点
from myapp import admin

# now use admin.site as you would use the default django one
urlpatterns = [
    # ...
    path('admin/', admin.site.urls),
    # ...
]
于 2021-12-22T09:14:35.507 回答