覆盖AdminSite以附加自定义网址

时间:2013-03-08 12:35:42

标签: python django django-admin

我按照手册中的描述覆盖了默认的 AdminSite 类,虽然它太纯粹,有关于此部分的信息。
我的 gs / admin.py 文件:

from django.contrib.admin import AdminSite
from django.conf.urls import patterns, url
from gs.views import *

class AdminSiteGs(AdminSite):

    def get_urls(self):
        urls = super(AdminSiteGs, self).get_urls()

        urls += patterns('',
             url(r'^my_admin_view/$', self.admin_view(my_admin_view))
        )

        return urls

admin_site_gs = AdminSiteGs()

gs 这是我的应用程序和项目名称。

gs / urls.py文件

from django.conf.urls import patterns, include, url
from page import views
from gs.admin import admin_site_gs

urlpatterns = patterns('',
    url(r'^admin/', include(admin_site_gs.urls)),
)

我有应用程序命名页面,我放置 admin.py 文件:

from gs.admin import admin_site_gs
from page.models import Page, Menu
from django.contrib import admin

class PageAdmin(admin.ModelAdmin):
    list_display = ('name', 'url', 'page_type')

class MenuAdmin(admin.ModelAdmin):
    list_display = ('name', 'code')

admin_site_gs.register(Page, PageAdmin)
admin_site_gs.register(Menu, MenuAdmin)

所以这里没有任何工作=( / admin / my_admin 视图(它返回404),主管理页面 / admin 。我没有看到我的模型我在 page / admin.py 文件中注册。

这可能听起来很有趣,但我尝试了所有工作人员在3-4小时内工作=))你可能会猜到我在Django和Python中都是新手...我现在想知道的是如何追加自定义我的重写类AdminSite的URL和视图?

我删除了autodiscover方法,所以现在看来​​Django对文件 page / admin.py 一无所知。

但第一个问题更有趣,为什么我在尝试访问 / admin / my_admin 页面时遇到404错误...

PS为什么我开头的问候被切断了o_O

2 个答案:

答案 0 :(得分:5)

根据文档,您为自定义管理员视图定义的任何网址格式必须在管理模式之前发生:https://docs.djangoproject.com/en/1.4/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_urls

尝试:

def get_urls(self):
    urls = super(AdminSiteGs, self).get_urls()

    my_urls = patterns('',
        url(r'^my_admin_view/$', self.admin_view(my_admin_view))
    )

    return my_urls + urls

您不需要像这样包含这些模式:

urlpatterns = patterns('',
    url(r'^admin/', include(admin_site_gs.urls)),  # not needed
)

答案 1 :(得分:1)

就我而言,我必须覆盖默认的“添加网址”,以便在管理员中单击“ +添加”按钮时重定向到自定义Django管理页面。 因此,如果我只是按照@Brandon所说的方式重写get_urls(),它将返回一个列表,其中包含重复的“添加” URL(自定义的URL和从超级目录检索的URL)。

    def get_urls(self):
        info = self.model._meta.app_label, self.model._meta.model_name
        urls = super(RetailerAdmin, self).get_urls()
        # We need to remove the original 'add_url' in order to use the custom one.
        urls.remove(urls[1])
        custom_url = [
            url(r'^batch/$', self.admin_site.admin_view(self.batch_upload_retailers),
                name='%s_%s_add' % info),
        ]
        return custom_url + urls

为解决此问题,我删除了原始的“添加”网址(请注意,“添加”网址始终位于位置1)。