2011-04-15 46 views
6

首先稍微背景:覆盖特定模型的Django管理URL?

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

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

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

我想要做的是保持此设置,但也保留旧的URL。我试着重载ModelAdmin的get_urls方法,但根据我的说法,您无法控制整个网址,只有在“/ app_label/model_class /”部分之后。

我想在主urls.py中覆盖它,但无法弄清楚一个可接受的视图。实际视图仅在实例化的ModelAdmin对象上可用,而不是类本身。

有关如何覆盖管理中使用的URL的任何想法?

回答

6

您可以覆盖EventModelAdminqueryset-method并过滤查询集,以便电影事件被排除。与此类似

东西:

class EventAdmin(admin.ModelAdmin): 

    def queryset(self, request): 
     qs = super(EventAdmin, self).queryset(request) 
     return qs.exclude(event_type='film') 
+0

好的。将那个添加到“我是白痴”类别。不能相信我没有想到这一点。谢谢! – 2011-04-15 18:06:20

8

望着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