首先是一些背景:
我有一个Event
模型具有各种event_type
s。我想将这些事件类型之一“电影”分解到它自己的管理中。我已经具备了基本功能:继承自的代理模型Event
, named Film
,该代理模型的自定义管理器,仅将其过滤为“电影”事件类型,并且它有自己的 ModelAdmin。
问题出在相反的情况下。我现在需要从主要过滤掉电影Event
行政。我不想改变Event
模型或其默认管理器,因为影响太广泛了。所以,我尝试创建另一个代理模型,EventAdminProxy
,其唯一目的是在管理员中提供经过过滤的事件列表。然后我注册这个模型,而不是Event
,与现有的 ModelAdmin。
这显然是有效的,但它有一个不幸的副作用,即更改管理中的 URL。更改列表不再位于“/admin/event/event/”,而是现在位于“/admin/event/eventadminproxy/”。
我想做的是保留此设置,但也保留旧的 URL。我尝试过重载 ModelAdminget_urls
方法,但据我所知,您无法控制那里的完整 URL,只能控制“/app_label/model_class/”部分之后的内容。
我考虑过在主 urls.py 中覆盖它,但无法找出可以接受的视图。实际视图仅在实例化的 ModelAdmin 对象上可用,而在类本身上不可用。
关于如何覆盖管理员中使用的 URL 有什么想法吗?
查看 Django 源代码,管理 URL 构建在两个位置,即ModelAdmin
实例,并且在AdminSite
实例。
您想要更改的部分是在 AdminSite 实例中构建的(django.contrib.admin.sites.AdminSite
),您可以将其子类化并覆盖get_urls
方法。如果您查看该方法的后半部分,您会看到以下内容:
# Add in each model's views.
for model, model_admin in self._registry.iteritems():
urlpatterns += patterns('',
url(r'^%s/%s/' % (model._meta.app_label, model._meta.module_name),
include(model_admin.urls))
)
在那里添加模型的 ._meta.module_name 这只是模型的小写名称(django.db.models.options.Options.contribute_to_class
).
一个简单的方法是覆盖站点的get_urls
方法并为代理模型添加一个字典或特殊情况,以便它使用不同的 url 而不是model._meta.module_name
,大致如下:
类 MyAdminSite(AdminSite):
module_name_dict = {
EventAdminProxy: 'myfunkymodulename'
}
def get_urls(self):
base_patterns = super(MyAdminSite, self).get_urls()
my_patterns = patterns('',)
for model, model_admin in self._registry.iteritems():
if model in self.module_name_dict:
module_name = self.module_name_dict[model]
my_patterns += patterns('',
url(r'^%s/%s/' % (model._meta.app_label, module_name),
include(model_admin.urls))
)
return my_patterns + base_patterns
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)