gpt4 book ai didi

django - 覆盖特定模型的 Django 管理 URL?

转载 作者:行者123 更新时间:2023-12-03 21:35:36 24 4
gpt4 key购买 nike

先说一点背景:

我有一个 Event具有各种 event_type 的模型s。我想将其中一种事件类型“电影”分解为它自己的管理员。我具备基本功能:继承自 Event 的代理模型, 命名为 Film ,该代理模型的自定义管理器,将其过滤为仅“电影”事件类型,并且它是自己的 ModelAdmin。

问题在于反过来。我现在需要从主要 Event 中过滤掉电影行政。我不想更改 Event模型或其默认管理器,因为影响太广泛了。所以,我尝试创建另一个代理模型,EventAdminProxy ,其唯一目的是在管理员中提供经过过滤的事件列表。然后我注册这个模型,而不是 Event ,与现有的 ModelAdmin。

这显然有效,但它有一个不幸的副作用,即在管理员中更改 URL。更改列表不再位于“/admin/event/event/”,而是位于“/admin/event/eventadminproxy/”。

我要做的是保留此设置,但也要保留旧 URL。我试过重载 ModelAdmin 的 get_urls方法,但据我所知,您无法控制那里的完整 URL,只能控制“/app_label/model_class/”部分之后的内容。

我想过在主 urls.py 中覆盖它,但无法找到一个可以接受的 View 来绑定(bind)。实际 View 仅在实例化的 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 ,大意是这样的:

class 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

关于django - 覆盖特定模型的 Django 管理 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5680405/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com