2011-01-14 17 views
18

मैं "-------------" विकल्प Django से छुटकारा पाने के लिए चाहते हैं को हटाने के कुछ चुने हुए इनपुट एक ModelFormModelChoiceField, खाली विकल्प

यह पर एक विदेशी कुंजी का प्रतिनिधित्व करने में कहते हैं been answered कि आप empty_label=none विकल्प का उपयोग कर सकते हैं, लेकिन मेरे पास मॉडलफॉर्म है, नियमित रूप से नहीं है और फ़ील्ड को ओवरराइड करने की अनुमति नहीं है।

मुझे पता है कि मैं आदेश

self.fields['my_foreign_key'].queryset = .... 

का उपयोग कर एक ModelChoiceField के क्वेरीसमूह को संशोधित करने में ModelForm की __init__() विधि ओवरराइड कर सकते हैं लेकिन यह, वास्तव में बदसूरत हो जाएगा के रूप में इस "मुख्य" पर 10 से अधिक foreign_keys होता है मॉडल, और वहाँ एक Modelform की तुलना में अधिक इस मॉडल

पर आधारित है पूरे संदर्भ:

  • प्रत्येक एक ही करने के लिए इन foreign_key बिंदुओं में से एक मॉडल के प्रकार: वे विकल्प के विशिष्ट सूचियां हैं, व्यवस्थापक के माध्यम से उनके संशोधन को कम करने के लिए कई मॉडल हैं।
  • ये सभी मॉडल मुख्य मॉडल से "to_field = code" संबंध के माध्यम से एक चार्फील्ड के आधार पर संबंधित हैं, जिसमें एक तीन-अक्षर कोड होता है (हे, मेरी गलती नहीं, मुझे विरासत एमएस एक्सेस डीबी का उपयोग करना था) इस CharField blank=True, unique=True विकल्प है, तो मैं, प्रत्येक सूची के लिए, एक "---No information yet---" रिकॉर्ड है जो है, तो आप यकीन है, एक तीन पत्र कोड के स्थान पर एक खाली मूल्य ...

बना सकते हैं अब स्थिति यह है: मैं मिल एक "खाली मूल्य" विकल्पों के साथ एक चयन इनपुट फ़ील्ड: django एक और मेरा, एक के बाद एक। मैं सिर्फ एक 'empty_label = none` विकल्प यहाँ भी याद आती है ...

+0

मुझे लगता है कि आप को फिर से परिभाषित/क्षेत्र के ऊपर लिख सकते हैं। मैं डेटटाइम मॉडल फ़ील्ड को फॉर्मफिल्ड (और डेटफिल्ड का एक अतिरिक्त फ़ील्ड जोड़ता हूं) में बदलने के लिए ऐसा करता हूं। फिर मैं तिथि और समय क्षेत्रों को गठबंधन करने के लिए फॉर्म की साफ() विधि को ओवरराइड करता हूं। –

उत्तर

27

आप सभी ModelChoiceField आप कुछ की तरह कर सकता है के लिए खाली विकल्प निकालना चाहते हैं ..

class Form(forms.ModelForm): 
    class Meta: 
     model = MyModel 

    def __init__(self, *args, **kwargs): 
     super(Form, self).__init__(*args, **kwargs) 
     modelchoicefields = [field for field_name, field in self.fields.iteritems() if 
      isinstance(field, forms.ModelChoiceField)] 

     for field in modelchoicefield: 
      field.empty_label = None 

लेकिन वह सब जगह लेंगे ModelChoiceField है, की तरह तो शायद कुछ अधिक ठीक छोटाबीजवाला: निश्चित रूप से __init__ की तुलना में आसान

for fieldname in ('field1','field2','field3','field4','field5','field6'): 
    self.fields[fieldname].empty_label = None 

आप का उल्लेख ऊपर लिख!

अद्यतन मोरित्ज़

से आप 2017+ उपयोग का उपयोग कर सकते हैं:

forms.ModelChoiceField(... empty_label=None 
+0

यह महान यूजी काम करता है, इच्छा है कि मैं यूपी तीर पर दस बार क्लिक कर सकता हूं। मॉडलफॉर्म इतने बंद नहीं हैं मैंने सोचा कि सभी –

+0

ईहे, अच्छा! : डी –

+0

अब आप निम्न कार्य कर सकते हैं: '' 'form.ModelChoiceField (... blank_label = none)' ' – Moritz

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