2011-04-28 19 views
10

के रेडियो चयन द्वारा उत्पन्न बोगस पसंद से छुटकारा पाने के लिए कैसे मैं Django 1.3 पर ModelForm का उपयोग कर रहा हूं।Django फॉर्म

models.py:

class UserProfile(models.Model): 
... 
gender = models.CharField(max_length=1, blank=True, choices=(('M', 'Male'), ('F', 'Female'), ('Unspecified', '')), default='M') 
... 

forms.py:

class UserProfileForm(ModelForm): 
    class Meta: 
     model = UserProfile 
     fields = ('gender') 
     widgets = { 
      'gender': forms.RadioSelect(), 
     } 

जब इस विजेट HTML में प्रदान की गई है, मुझे मिल गया

<ul> 
<li><label for="id_gender_0"><input type="radio" id="id_gender_0" value="" name="gender" />---------</label></li> 
<li><label for="id_gender_1"><input checked="checked" type="radio" id="id_gender_1" value="M" name="gender" /> Male</label></li> 
<li><label for="id_gender_2"><input type="radio" id="id_gender_2" value="F" name="gender" />Female</label></li> 
<li><label for="id_gender_3"><input type="radio" id="id_gender_3" value="" name="gender" /> Unspecified</label></li> 
</ul> 

समस्या: कैसे कर सकते हैं मैं फर्जी पसंद से छुटकारा पाता हूं "--------"?

वही समस्या किसी अन्य स्टैक ओवरफ्लो उपयोगकर्ता द्वारा महीने पहले (Here) द्वारा लाई गई थी। मैंने वहां स्वीकृत समाधान की कोशिश की है (जैसा कि आप देख सकते हैं) लेकिन यह मेरे लिए काम नहीं करता है।

उत्तर

9

यहां तक ​​कि खाली के बिना = सही यह अतिरिक्त इनपुट दिखाता है।

from itertools import chain 
from django.forms import RadioSelect 
from django.utils.encoding import force_unicode 

class RadioSelectNotNull(RadioSelect): 
    def get_renderer(self, name, value, attrs=None, choices=()): 
     """Returns an instance of the renderer.""" 
     if value is None: value = '' 
     str_value = force_unicode(value) # Normalize to string. 
     final_attrs = self.build_attrs(attrs) 
     choices = list(chain(self.choices, choices)) 
     if choices[0][0] == '': 
      choices.pop(0) 
     return self.renderer(name, str_value, final_attrs, choices) 
+2

निकजे का जवाब सही प्रतीत होता है, लेकिन मैं एक चीज़ जोड़ना चाहता हूं। यदि मुझे गलत नहीं है, तो निम्न पंक्ति विकल्प = सूची (श्रृंखला (self.choices, विकल्प)) श्रृंखला में अतिरिक्त आयात की आवश्यकता होती है: itertools आयात श्रृंखला से –

1

जब आप विजेट सेट करते हैं तो आप विकल्प सेट कर सकते हैं। यह दिखा रहा है ---- क्योंकि आपके मॉडल में आपके पास खाली = सही है।

बस विजेट के विकल्पों का उपयोग करें और इसे अपने मॉडल में सेट किए गए विकल्पों पर सेट करें।

+0

यह भी जब 'खाली = FALSE' मॉडल पर मेरे लिए होता है। –

5

सेट blank=False (या बस इसे निकालने के लिए) है और यह भी ModelChoiceField द्वारा प्रयोग किया जाता सूची के शीर्ष पर एक खाली विकल्प होगा विजेट default='Unspecified'

+0

Django 1.4.5 में, यह अच्छी तरह से काम करता है, धन्यवाद! – mkoistinen

1

जोड़ने डिफ़ॉल्ट रूप से: मैं एक नया विजेट बनाया है।

आप ("---------" डिफ़ॉल्ट रूप से जो है) empty_label विशेषता के साथ इस लेबल के पाठ को बदल सकते हैं, या आप को कोई नहीं पर empty_label की स्थापना करके खाली लेबल पूर्ण रूप से अक्षम कर सकते हैं:

एक कस्टम खाली लेबल:

field1 = forms.ModelChoiceField(queryset=..., empty_label="(Nothing)") 

कोई खाली लेबल:

field2 = forms.ModelChoiceField(queryset=..., empty_label=None) 
संबंधित मुद्दे