2009-05-14 15 views
9

मैं एक मॉडल एक क्षेत्र "राज्य" का नाम दिया गया है है:कैसे व्यवस्थापक पृष्ठों पर विकल्पों को संशोधित करने के - Django

class Foo(models.Model): 
    ... 
    state = models.IntegerField(choices = STATES) 
    ... 

हर राज्य के लिए, संभावित विकल्प सभी राज्यों की एक निश्चित सबसेट हैं।

if foo.state == STATES.OPEN:  #if foo is open, possible states are CLOSED, CANCELED 
    ... 
if foo.state == STATES.PENDING: #if foo is pending, possible states are OPEN,CANCELED 
    ... 

नतीजतन, जब एक नए राज्य के लिए foo.state परिवर्तन, संभावित विकल्प के अपने सेट में भी परिवर्तन होता: उदाहरण के लिए।

मैं व्यवस्थापक को जोड़ने/बदलने वाले पृष्ठों पर इस कार्यक्षमता को कैसे कार्यान्वित कर सकता हूं?

उत्तर

9

आपको लगता है कि मॉडल के लिए ModelAdmin कक्षा में use a custom ModelForm करने की जरूरत है प्रदान करने के लिए।

class FooForm(forms.ModelForm): 
    class Meta: 
     model = Foo 

    def __init__(self, *args, **kwargs): 
     super(FooForm, self).__init__(*args, **kwargs) 
     current_state = self.instance.state 
     ...construct available_choices based on current state... 
     self.fields['state'].choices = available_choices 

आप इसे इस तरह का उपयोग करेंगे::

class FooAdmin(admin.ModelAdmin): 
    form = FooForm 
+0

व्यवस्थापक के लिए 'एड' दृश्यों पर क्या होता है, क्योंकि कोई self.instance नहीं है, आप फ़िल्टरिंग के उदाहरण पर निर्भर नहीं हो सकते हैं, अनुरोध करना होगा ऑब्जेक्ट –

+0

हां, इस मॉडलफॉर्म को संभालने की आवश्यकता होगी self.instance की अनुपस्थिति और प्रारंभिक उपलब्ध विकल्पों को उचित रूप से सेट करें। मुझे नहीं पता कि अनुरोध ऑब्जेक्ट प्रासंगिक क्यों है, लेकिन आपके पास ModelAdmin.add_view (http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py# में इसका उपयोग है) L704)। –

+0

क्या मॉडल में विकल्प बदलना संभव है? आखिरकार, फ़ील्ड बनाते समय विकल्पों को मॉडल में निर्दिष्ट किया जाता है। –

-1

मैं देखता हूं कि आप क्या करने की कोशिश कर रहे हैं, लेकिन क्यों न केवल उन सभी को प्रदर्शित करें और यदि व्यक्ति वर्तमान स्थिति (पहले से सेट) को चुनता है, तो बस कुछ भी न बदलें?

आप भी सिर्फ एक फार्म के साथ एक दृश्य बना सकते हैं इस कार्यक्षमता

+0

यह एक संभावना है, हालांकि एक बहुत ही सुरुचिपूर्ण और सुरक्षित नहीं है। राज्य को बदलना डेटा की कुछ गणनाओं और संशोधनों को ट्रिगर करता है, इसलिए मैं वास्तव में उपयोगकर्ताओं पर भरोसा नहीं करना चाहता हूं, भले ही वे व्यवस्थापक हों। – shanyu

0

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

आप मॉडलएडमिन मीडिया श्रेणी का उपयोग कर मॉडल के व्यवस्थापक पृष्ठ में कस्टम जावास्क्रिप्ट लोड कर सकते हैं, here दस्तावेज।

+1

नहीं, वह उसी फ़ील्ड के वर्तमान मूल्य के आधार पर किसी फ़ील्ड के अगले मान के लिए विकल्प सेट करने का प्रयास कर रहा है - एक महत्वपूर्ण अंतर। इसलिए विकल्पों को गतिशील रूप से क्लाइंट-साइड बदलना प्रासंगिक नहीं है; वास्तव में यह बहुत भ्रमित होगा। –

12

जब आप किसी मॉडल के लिए एक नया व्यवस्थापक इंटरफ़ेस बनाते हैं (उदा। MyModelAdmin) फ़ील्ड के डिफ़ॉल्ट विकल्पों को ओवरराइड करने के लिए विशिष्ट विधियां हैं। एक सामान्य choice field के लिए:

class MyModelAdmin(admin.ModelAdmin): 
    def formfield_for_choice_field(self, db_field, request, **kwargs): 
     if db_field.name == "status": 
      kwargs['choices'] = (
       ('accepted', 'Accepted'), 
       ('denied', 'Denied'), 
      ) 
      if request.user.is_superuser: 
       kwargs['choices'] += (('ready', 'Ready for deployment'),) 
     return super(MyModelAdmin, self).formfield_for_choice_field(db_field, request, **kwargs) 

लेकिन क्या आप भी ForeignKey और Many to Many संबंधों के लिए विकल्पों को ओवरराइड कर सकते हैं।

+3

यह स्वीकार्य उत्तर होना चाहिए क्योंकि यह सबसे आसान और सर्वोत्तम समाधान है। –

+0

@shanyu यह स्वीकार्य उत्तर होना चाहिए क्योंकि यह समस्या को संभालने का सबसे महत्वपूर्ण तरीका है। – Jay

संबंधित मुद्दे