2010-02-10 14 views
12

मुझे पृष्ठ जोड़ने और बदलने के लिए अलग-अलग दृश्यों की आवश्यकता है। ऐड पेज में मैं कुछ फ़ील्ड इनलाइन फॉर्मेट से बाहर करना चाहता हूं। मैंने दो टैबुलरइनलाइन कक्षाएं तैयार की हैं, उनमें से एक में संपत्ति 'बहिष्कृत' है। मैंने उन्हें निम्न प्रकार का उपयोग करने की कोशिश की:Django व्यवस्थापक परिवर्तन के लिए अलग-अलग रूपरेखा जोड़ता है और दृश्य जोड़ें

class BoxAdmin(admin.ModelAdmin): 
    def change_view(self, request, obj_id): 
     self.inlines=[ItemChangeInline,] 
     return super(BoxAdmin, self).change_view(self.request, obj_id) 
    def add_view(self, request): 
     self.inlines=[ItemAddInline,] 
     return super(BoxAdmin, self).add_view(self, request) 

कोई प्रभाव नहीं (कोई इनलाइन बिल्कुल दिखाई नहीं दे रही है)।

उत्तर

1

क्यों add_view में आपके पास .add_view(self, request) है और परिवर्तन दृश्य में आपके पास .change_view(self.request, ..) है? मेरा मानना ​​है कि, आप add_view में स्वयं की आवश्यकता नहीं है, क्योंकि आप सुपर का उपयोग करते हैं।

class BoxAdmin(admin.ModelAdmin): 
    def change_view(self, request, obj_id): 
     self.inlines=[ItemChangeInline,] 
     for inline_class in self.inlines: 
      inline_instance = inline_class(self.model, self.admin_site) 
      self.inline_instances.append(inline_instance) 
     return super(BoxAdmin, self).change_view(request, obj_id) 
    def add_view(self, request): 
     self.inlines=[ItemAddInline,] 
     for inline_class in self.inlines: 
      inline_instance = inline_class(self.model, self.admin_site) 
      self.inline_instances.append(inline_instance) 
     return super(BoxAdmin, self).add_view(request) 

हालांकि, इस असजीला लग रहा है, इस हिस्से का कारण:

  for inline_class in self.inlines: 
      inline_instance = inline_class(self.model, self.admin_site) 
      self.inline_instances.append(inline_instance) 

init व्यवस्थापक के विधि से एक कॉपी-पेस्ट है

7

यहाँ कोड है कि काम कर रहा है है .ModelAdmin (तो यह दो बार चलाया जाता है)।

15

यह Django 1.5+ के साथ काम करता है और ठीक लग रहा है & सुरुचिपूर्ण:

// admin.py 
class BoxAdmin(ModelAdmin): 

    inlines =() 

    def change_view(self, request, object_id, form_url='', extra_context=None): 
     self.inlines = (ItemChangeInline,) 
     return super(BoxAdmin, self).change_view(request, object_id) 

    def add_view(self, request, form_url='', extra_context=None): 
     self.inlines = (ItemAddInline,) 
     return super(BoxAdmin, self).add_view(request) 

आशा है कि यह किसी को भी

+1

Django के लिए मैं इसे शब्दशः इस्तेमाल किया और यह काम करता है, मैं बदल दिया है, हालांकि साथ 'लौट सुपर (BoxAdmin, आत्म) .change_view (अनुरोध, object_id, form_url, extra_context)' दो रिटर्न और 'वापसी सुपर (BoxAdmin, स्वयं) .add_view (अनुरोध, form_url, extra_context) ' –

0

मैं एक स्थिति थी, जहां मैं व्यवस्थापक साइट के आधार पर एक इनलाइन दिखाने के लिए होगी के लिए उपयोगी हो सकता है कि आप एक दी गई कहानी के लिए थे।

alekwisnia के जवाब में विस्तार करते हुए, मैं गतिशील Django 1.3 के लिए काम निम्नलिखित कोड का उपयोग कर inlines प्राप्त करने में सक्षम था:

पर प्रकाश डाला में/admin.py

class HighlightInline(generic.GenericTabularInline): 
    model = Highlight 
    extra = 1 
    max_num = 4 
    fields = ('order', 'highlight') 
    template = 'admin/highlights/inline.html' 

class HighlightAdmin(admin.ModelAdmin): 
    def regulate_highlight_inlines(self): 
     highlights_enabled = Setting.objects.get_or_default('highlights_enabled', default='') 
     highlight_inline_instance = HighlightInline(self.model, self.admin_site) 
     highlight_found = any(isinstance(x, HighlightInline) for x in self.inline_instances) 
     if highlights_enabled.strip().lower() == 'true': 
      if not highlight_found: 
       self.inline_instances.insert(0, highlight_inline_instance) 
     else: 
      if highlight_found: 
       self.inline_instances.pop(0) 
     print self.inline_instances 

    def change_view(self, request, object_id, form_url='', extra_context=None): 
     self.regulate_highlight_inlines() 
     return super(HighlightAdmin, self).change_view(request, object_id) 

    def add_view(self, request, form_url='', extra_context=None): 
     self.regulate_highlight_inlines() 
     return super(HighlightAdmin, self).add_view(request, form_url, extra_context) 

कहानी/व्यवस्थापक में। नोट करने के लिए py

class StoryAdmin(HighlightAdmin): 

एक बात है कि मैं केवल में नहीं जोड़ तोड़ कर रहा हूँ है लाइन क्लासेस (हाइलाइटइनलाइन) बल्कि, मैं इनलाइन उदाहरणों को बदल रहा हूं (हाइलाइटइनलाइन (self.model, self.admin_site))। ऐसा इसलिए है क्योंकि django ने पहले से ही व्यवस्थापक वर्ग के प्रारंभिक निर्माण के दौरान इनलाइन कक्षाओं की सूची के आधार पर इनलाइन उदाहरणों की एक सूची बनाई है।

0

एक अन्य समाधान 1,3

class BoxAdmin(admin.ModelAdmin): 

    def change_view(self, request, object_id, form_url='', extra_context=None): 
     self.inline_instances = [ItemChangeInline(self.model, self.admin_site)] 
     return super(BoxAdmin, self).change_view(request, object_id, extra_context) 

    def add_view(self, request, form_url='', extra_context=None): 
     self.inline_instances = [ItemAddInline(self.model, self.admin_site)] 
     return super(BoxAdmin, self).add_view(request, form_url, extra_context)