我不确定我在这里报告的发现是否对kender有所帮助,因为除此之外,我不知道他是否仅谈论了两个管理站点,还是每个站点都有一个数据库。这就是我的情况。我想到了一个好主意,我希望我的一个新应用程序拥有自己的数据库和管理页面。
但是,我遇到了Bernhard Vallant的AdminSite子类方法的问题,尽管它似乎是正统且基本正确的方法。我解决了这个问题。
这是我发现必须进行的Bernhard Vallant代码修改:
from django.contrib.admin.sites import AdminSite
class MyAdminSite(AdminSite):
pass
myadmin = MyAdminSite(name='anything')
是的,我确实指的是你选择的name='anything'(只要不是'admin')。我已经反复尝试过了,如果不使用除了admin以外的名称分配,每次都会失败。
我遇到的症状是,当我添加第二个数据库并为其创建myadmin,然后使用myadmin.register(My_ModelA)注册模型,并查看两个管理应用程序页面时,使用第二个数据库和myadmin的新应用程序的页面和My_ModelA模型看起来很好,但我的旧管理页面显示其模型的死链接,当我在那里单击一个非死链接的应用程序(使用旧数据库的旧应用程序)时,我得到404代码,表示页面不存在。
此外,我不知道这是否重要,但我在项目urlconf中做了与Bernhard Vallant不同的事情:
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include('mynewapp.urls')),
url(r'^someword/admin/', include(admin.site.urls)),
)
好的,“某些词语”是无关紧要的---它只是为最终用户外观考虑,不是应用程序或项目的名称。但相关联的管理员是我的旧应用程序和旧数据库的管理员。请注意autodiscover()的包含。在Bernhard Vallant链接的文档中有一些模糊的语言,涉及到当项目urlconf配置如Bernhard Vallant这样使用myadmin导入时,以及对默认管理员的引用。
对于我新应用程序的urlconf,我有:
from django.conf.urls import patterns, url, include
from myproject.admin import myadmin
urlpatterns = patterns('',
url(r'/', include(myadmin.urls) )
)
urlpatterns += patterns('mynewapp.views',"... url() stuff for mynewapp's views"),
)
尽管在内部将AdminSite实例命名为其他名称是绝对必要的,但我必须补充说,当需要使用admin.ModelAdmin作为父类来装饰mynewapp的admin.py文件时,确实需要使用admin.ModelAdmin。毕竟,myadmin是AdminSite子类的一个实例。因此,我认为它与admin.site平起平坐,而不是与admin相同。
对于像我这样的新手来说,这一切非常令人困惑,因为小写的admin看起来像一个实例,而我不熟悉实例的子类化。所以我假设它不是实例。