Python 如何为django管理员创建自定义页面?

Python 如何为django管理员创建自定义页面?,python,django,django-admin,Python,Django,Django Admin,我想为没有模型的管理面板创建自定义页面。首先,我将index.html复制到项目文件夹: mysite/ templates/ admin/ index.html 然后添加到应用程序阻止我的代码: <div class="module"> <table summary="{% blocktrans with name="preferences" %}Models available in the preferences

我想为没有模型的管理面板创建自定义页面。首先,我将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>
并将代码添加到preferences.html:

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

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

您需要在管理员自身的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')),
)

这样,Django的管理员就不会处理URL。

您应该使用admin。

以下是自Django 1.6起,自定义管理员页面所需的一切示例,该页面通过对象详细信息页面右上角历史按钮旁边的按钮链接:

完整示例:

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 migration来为DummyModel创建表。

几年过去了,仍然可以发布相关的答案

使用Django 1.10+可以执行以下操作:

security/admin.py这是你的应用程序的管理文件

security/templates/configuration.html

请参阅确保选择正确的Django版本,此代码对上面的1.10版有效

注意上面使用的get_url。 这个新的管理员页面将被删除 可通过以下网址访问: 此页面将在管理员登录区域下受到保护
如果您想创建一个自定义页面,只是为了在其中放置一个任意表单来处理用户输入,您可以尝试一下。您可以使用etc.admin.CustomModelPage:

管理员 从etc.admin导入CustomModelPage 类MyPageCustomModelPage: title='My custom page'设置页面标题 定义一些要从中处理数据的字段。 my_field=models.CharField'some title',最大长度=10 def saveself: 这里实现数据处理。 超级保存 在Django admin中注册页面。 MyPage.register
您将URL添加到了哪个URL.py?可能是Django的admin中有一个更通用的正则表达式正在捕获/admin/首选项,因此它永远不会到达您的URL正则表达式。我在/mysite/mysite/URL.py中只有一个URL.py,我认为这不是URL中的错误,因为我没有URL模式错误。如果是这种情况,您将不会收到错误消息。您是否尝试过将URL更改为其他内容,以查看在这种情况下是否获得管理页面?例如,^testadmin/preferences/$?与此url配合使用效果良好。我可以看到我的首选项页面,但我想使用^admin/preferences/$url.get_url是ModelAdmin的一种方法,而ModelAdmin需要一个模型,但OP特别希望为没有模型的管理面板创建自定义页面。重点补充。他指的是AdminSite的get_URL是的,请参见此处:该页面将受到保护还是对公众开放?@DwayneCrooks我迟到了几年,但它需要由使用python manage.py createsuperuser创建的超级用户登录。@ICanKindOfCode否不需要t@decadenza安装的应用程序中是否列出了具有虚拟模型的应用程序?是,我仍在努力了解问题所在。谢谢。尝试重新启动服务器。django将在DBkey中查找用户\u dummy\u模型。因为此问题是管理面板*没有*模型,此解决方案与模型绑定。
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)
        ]
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)
{% extends "admin/base_site.html" %}
{% block content %}
...
{% endblock %}