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

4

2 回答 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
)
于 2013-03-08T13:28:47.257 回答
2

在我的情况下,我必须覆盖默认的“添加 url”,以便在单击管理员中的“+添加”按钮时重定向到自定义 Django 管理页面。因此,如果我只是按照@Brandon 所说的方式覆盖 get_urls() ,它将返回一个带有重复“添加”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

为了解决这个问题,我删除了原来的 'add' url(注意 'add' url 总是在位置 1)。

于 2019-04-04T15:26:17.447 回答