2011-04-15 14 views
6

पहले थोड़ा सा पृष्ठभूमि:विशिष्ट मॉडल के लिए Django व्यवस्थापक URL ओवरराइड करें?

मेरे पास Event मॉडल है जिसमें विभिन्न event_type एस हैं। मैं उन कार्यक्रमों में से एक को 'फिल्म', अपने स्वयं के व्यवस्थापक में तोड़ना चाहता हूं। मेरे पास मूलभूत कार्यक्षमता है: Event से प्राप्त प्रॉक्सी मॉडल, Film नामक प्रॉक्सी मॉडल, उस प्रॉक्सी मॉडल के लिए एक कस्टम मैनेजर जो इसे केवल 'फिल्म' ईवेंट प्रकारों में फ़िल्टर करता है, और यह स्वयं का मॉडलएडमिन है।

समस्या रिवर्स के साथ है। अब मुझे मुख्य Event व्यवस्थापक से फिल्मों को फ़िल्टर करने की आवश्यकता है। मैं Event मॉडल या उसके डिफ़ॉल्ट प्रबंधक को बदलना नहीं चाहता, क्योंकि प्रभाव बहुत व्यापक होगा। इसलिए, मैंने व्यवस्थापक में घटनाओं की एक फ़िल्टर सूची प्रदान करने के एकमात्र उद्देश्य के साथ, एक और प्रॉक्सी मॉडल, EventAdminProxy बनाने का प्रयास किया। मैं मौजूदा मॉडलएडमिन के साथ Event के बजाय, इस मॉडल को पंजीकृत करता हूं।

यह स्पष्ट रूप से काम करता है, लेकिन व्यवस्थापक में यूआरएल को बदलने का दुर्भाग्यपूर्ण दुष्प्रभाव है। चेंजलिस्ट के बजाय "/ admin/event/event /" पर होने के बजाय, यह अब "/ admin/event/eventadminproxy /" पर है।

जो मैं करने की कोशिश कर रहा हूं वह इस सेटअप को बनाए रखता है, लेकिन पुराना यूआरएल भी रखता है। मैंने ModelAdmin की get_urls विधि को अधिभारित करने का प्रयास किया है, लेकिन मैं जो कह सकता हूं उससे, आप वहां पूर्ण यूआरएल को नियंत्रित नहीं कर सकते हैं, केवल "/ app_label/model_class /" भाग के बाद आता है।

मैंने इसे मुख्य urls.py में ओवरराइड करने के बारे में सोचा, लेकिन इसमें शामिल होने के लिए एक स्वीकार्य दृश्य नहीं पता लगाया जा सकता है। वास्तविक विचार केवल तत्काल मॉडलएडमिन ऑब्जेक्ट पर उपलब्ध हैं, न कि क्लास स्वयं।

व्यवस्थापक में यूआरएल का उपयोग कैसे किया जा रहा है इसके बारे में कोई विचार?

उत्तर

6

आप अपने EventModelAdmin के queryset-method को ओवरराइड कर सकते हैं और क्वेरीसेट फ़िल्टर कर सकते हैं ताकि फिल्म-ईवेंट को बाहर रखा जा सके।

कुछ इस के समान:

class EventAdmin(admin.ModelAdmin): 

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

ठीक है। उसमें से एक को "मैं मूर्ख हूं" श्रेणी में जोड़ें।विश्वास नहीं कर सकता मैंने उस बारे में नहीं सोचा था। धन्यवाद! –

8

Django स्रोत को देखते हुए, व्यवस्थापक यूआरएल ModelAdmin मामलों में, दो स्थानों पर बनाया गया है, और AdminSite मामलों में कर रहे हैं।

जो भाग आप बदलना चाहते हैं वह AdminSite इंस्टेंस (django.contrib.admin.sites.AdminSite) में बनाया गया है, आप इसे उपclass कर सकते हैं और 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) है जोड़ रहा है।

वर्ग MyAdminSite (:

एक आसान तरीका है बाहर साइट की get_urls विधि ओवरराइड और प्रॉक्सी मॉडल के लिए एक dict या विशेष मामला जोड़ने के लिए तो यह पंक्तियों के साथ कुछ model._meta.module_name के बजाय एक अलग यूआरएल का उपयोग करता है, है 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 
संबंधित मुद्दे