重写AdminSite以添加自定义URL

4 投票
2 回答
11710 浏览
提问于 2025-04-17 18:24

我按照手册的说明重写了默认的 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 个回答

2

在我的情况下,我需要重写默认的“添加网址”功能,这样当我在管理界面点击“+添加”按钮时,就能跳转到一个自定义的Django管理页面。如果我只是按照@Brandon说的那样重写get_urls(),那么返回的列表中会有两个重复的“添加”网址(一个是自定义的,一个是从父类获取的)。

    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

为了解决这个问题,我删除了原来的“添加”网址(注意“添加”网址总是在列表中的第一个位置)。

7

根据文档,你为自定义管理视图定义的任何网址模式必须在管理模式之前出现: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
)

撰写回答