覆盖AdminSite以添加自定义URL

4

我按照手册中的说明重写了默认的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)),
)

我有一个名为page的应用程序,其中我放置了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 的新手...现在我想知道的就是如何将自定义URL和视图添加到我的 AdminSite 类的重写中?
我删除了 autodiscover 方法,所以现在似乎 Django 没有看到关于文件 page/admin.py 的任何信息。
但第一个问题更有趣,为什么我在尝试访问/admin/my_admin页面时会出现404错误...
PS为什么我的开头问候语被切掉了 o_O
2个回答

6
根据文档,您为自定义管理视图定义的任何URL模式必须出现在管理员模式之前,参见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
)

谢谢!改变URL顺序已经解决了问题!但是您能否告诉我什么意思,模式不需要?如果我注释掉admin_site_gs.urls,Django如何知道我的URL放在哪里? - James May
通过重写 get_urls(),Django 会动态地为您添加模式。由于它们都以 /admin 开头,因此您不必在基本的 urls.py 文件中手动包含它们。 - Brandon Taylor

2
在我的情况下,我需要覆盖默认的“添加URL”,以便在单击管理员中的“+添加”按钮时重定向到自定义的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位置)。最初的回答。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接