2009-08-10 11 views
14

मैं Django में एक प्रोफाइल फॉर्म बना रहा हूँ। बहुत सारे वैकल्पिक अतिरिक्त प्रोफ़ाइल फ़ील्ड हैं लेकिन मैं केवल एक समय में दो दिखाना चाहता हूं। मैं उन क्षेत्रों को कैसे छुपा या हटा सकता हूं जिन्हें मैं गतिशील रूप से दिखाना नहीं चाहता हूं?आप Django में फॉर्म फ़ील्ड को गतिशील रूप से कैसे छिपाते हैं?

class UserProfileForm(forms.ModelForm): 
    extra_fields = ('field1', 'field2', 'field3') 
    extra_field_total = 2 

    class Meta: 
     model = UserProfile 

    def __init__(self, *args, **kwargs): 
     extra_field_count = 0 
     for key, field in self.base_fields.iteritems(): 
      if key in self.extra_fields: 
       if extra_field_count < self.extra_field_total: 
        extra_field_count += 1 
       else: 
        # do something here to hide or remove field 
     super(UserProfileForm, self).__init__(*args, **kwargs) 
+0

संबंधित उत्तर: http://stackoverflow.com/a/1914812/462865 –

उत्तर

14

मुझे लगता है कि मुझे अपना जवाब मिला।

सबसे पहले मैंने कोशिश की:

field.widget = field.hidden_widget 

जो काम नहीं किया।

सही तरीका होता है:

field.widget = field.hidden_widget() 
0

आप फार्म में इस कोडिंग कर रहे हैं:

यहाँ मैं अब तक है। टेम्पलेट कोड में सीएसएस और जावास्क्रिप्ट का उपयोग करके ऐसा करने के लिए और अधिक समझदारी नहीं होगी? एक फ़ील्ड छिपाना उतना ही आसान है जितना "डिस्प्ले = 'कोई नहीं' 'सेट करना और इसे' ब्लॉक 'पर टॉगल करना, कहें, अगर आपको इसे प्रदर्शित करने की ज़रूरत है।

शायद आवश्यकता के बारे में कुछ संदर्भ यह स्पष्ट करेगा।

+3

सबसे पहले, क्योंकि मुझे लगता है कि फॉर्म तर्क फॉर्म में रहना चाहिए। इसके अलावा, क्योंकि मैं देखता हूं कि पहले से ही कौन से फ़ील्ड पहले ही भर चुके हैं और उन्हें नहीं दिखाते हैं। –

+1

यह प्रस्तुति परत में व्यापार तर्क चलाता है ("इन वस्तुओं में यह फ़ील्ड नहीं है")। विशेष रूप से खराब यदि वेब डेवलपर बैकएंड डेवलपर नहीं है। –

3

भी

def __init__(self, instance, *args, **kwargs):  
    super(FormClass, self).__init__(instance=instance, *args, **kwargs) 
    if instance and instance.item: 
     del self.fields['field_for_item'] 
3
def __init__(self, *args, **kwargs): 
      is_video = kwargs.pop('is_video') 
      is_image = kwargs.pop('is_image') 
      super(ContestForm, self).__init__(*args, **kwargs) 
      if is_video: 
       del self.fields['video_link'] 
       #self.exclude('video_link') 
      if is_image: 
       del self.fields['image'] 

उपयोग self.exclude करने के बजाय हटाने का उपयोग कर सकते।

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