覆盖特定模型的Django Admin URL?

| 首先一点背景: 我有一个带有各种
event_type
Event
模型。我想将其中一种事件类型“电影”细分为自己的管理员。我具有基本的功能:从ѭ0inherit继承的代理模型,名为
Film
,该代理模型的自定义管理器,仅将其过滤为“电影”事件类型,并拥有自己的ModelAdmin。 问题出在反向。现在,我需要从主
Event
管理员中过滤掉电影。我不想更改“ 0”模型或其默认管理器,因为影响可能过于广泛。因此,我尝试创建另一个代理模型ѭ6,其唯一目的是在管理员中提供事件的过滤列表。然后,我用现有的ModelAdmin注册该模型,而不是ѭ0。 这显然是可行的,但是它具有在管理员中更改URL的不幸副作用。现在,更改列表不再位于\“ / admin / event / event / \”,而是位于\“ / admin / event / eventadminproxy / \”。 我想做的是保留此设置,同时保留旧的URL。我曾尝试重载ModelAdmin的
get_urls
方法,但据我所知,您无法控制其中的完整URL,只能控制\“ / app_label / model_class / \”部分之后的内容。 我曾考虑过在主urls.py中覆盖它,但无法找出可以接受的视图。实际视图仅在实例化的ModelAdmin对象上可用,而在类本身上不可用。 关于如何覆盖管理员使用的URL的任何想法?     
已邀请:
您可以覆盖
EventModelAdmin
的queryset方法并过滤查询集,以便排除电影事件。 类似于以下内容:
class EventAdmin(admin.ModelAdmin):

    def queryset(self, request):
        qs = super(EventAdmin, self).queryset(request)
        return qs.exclude(event_type=\'film\')
    
查看Django源代码,管理URL在admin11ѭ实例和
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
)。 一种简单的解决方法是覆盖Site的
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
    
您还可以将
ChangeList
子类化并覆盖
url_for_result()
方法以自定义更改网址(从其他答案中了解),例如:
from django.contrib.admin.views.main import ChangeList

class FooChangeList(ChangeList):
    def url_for_result(self, obj):
        return \'/foos/foo/{obj.pk}/\'

class FooAdmin(admin.ModelAdmin):
    def get_changelist(self, request, **kwargs):
        return FooChangeList
该问题的适应示例:
from django.contrib.admin.views.main import ChangeList
from django.urls import reverse

class FilmAdmin(admin.ModelAdmin):
    def get_changelist(self, request, **kwargs):
        class FilmChangeList(ChangeList):
            def url_for_result(self, obj):
                return reverse(\'admin:events_event_change\', args=(obj.pk))
        return FilmChangeList
    

要回复问题请先登录注册