2011-04-15 72 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