2009-07-15 18 views
64

में फ़ील्ड की आवश्यकता है मेरे पास एक ऐसा फॉर्म है जहां दो फ़ील्ड आवश्यकतानुसार बाहर आ रहे हैं जब मैं उन्हें भी नहीं चाहता हूं। यहाँ models.py से प्रपत्रDjango को मॉडल फॉर्म

class CircuitForm(ModelForm): 
    class Meta: 
     model = Circuit 
     exclude = ('lastPaged',) 
    def __init__(self, *args, **kwargs): 
     super(CircuitForm, self).__init__(*args, **kwargs) 
     self.fields['begin'].widget = widgets.AdminSplitDateTime() 
     self.fields['end'].widget = widgets.AdminSplitDateTime() 

वास्तविक सर्किट मॉडल में है, खेतों इस तरह परिभाषित कर रहे हैं:

begin = models.DateTimeField('Start Time', null=True, blank=True) 
end = models.DateTimeField('Stop Time', null=True, blank=True) 

इस के लिए मेरे views.py यहाँ है:

def addCircuitForm(request): 
    if request.method == 'POST': 
     form = CircuitForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      return HttpResponseRedirect('/sla/all') 
    form = CircuitForm()  
    return render_to_response('sla/add.html', {'form': form}) 

मैं क्या कर सकता हूं ताकि दोनों क्षेत्रों की आवश्यकता न हो?

+1

लिए कोई तरीका है कि इन क्षेत्रों विजेट को बदलने के लिए आवश्यक बन गया है। यदि मॉडल में (शून्य = सही, रिक्त = सही) है, तो मॉडलफॉर्म इसे आवश्यक = गलत के रूप में प्रस्तुत करता है। – simplyharsh

+0

ऐसा लगता है कि आप सही हैं। खेतों की खुद की आवश्यकता नहीं है लेकिन विजेट में दिनांक और समय फ़ील्ड आवश्यक हैं। – Ryan

उत्तर

102

आप मॉडल (ऐसा करने से व्यवस्थापक साइट में सामान्य मान्यता टूट जाएगा) के अंदर अपने क्षेत्रों के लिए खाली सेटिंग को संशोधित करने के लिए नहीं करना चाहते हैं, तो आप अपने प्रपत्र वर्ग में निम्न कर सकते हैं कन्स्ट्रक्टर किसी भी कार्यक्षमता को नुकसान नहीं पहुंचाएगा।

+0

धन्यवाद !!! यह मेरे कस्टम विजेट के साथ 'blank = True' को स्वीकार नहीं कर रहा था। – osa

16

यदि मॉडल फ़ील्ड में रिक्त = सही है, तो आवश्यक फ़ील्ड फ़ील्ड पर गलत पर सेट किया गया है। अन्यथा, आवश्यक = सच

इसलिए यहाँ का कहना है http://docs.djangoproject.com/en/dev/topics/forms/modelforms/

ऐसा लगता है कि सब कुछ सही कर रहे हैं। आप self.fields['end'].required के मान की जांच कर सकते हैं।

def __init__(self, *args, **kwargs): 
    super(CircuitForm, self).__init__(*args, **kwargs) 

    for key in self.fields: 
     self.fields[key].required = False 

नए सिरे से परिभाषित:

+0

ध्यान दें कि कुछ फ़ील्ड्स (उदा। 'बूलियनफ़िल्ल्ड') में रिक्त हैं = उनके कन्स्ट्रक्टर (https://docs.djangoproject.com/en/dev/_modules/django/db/models/fields/#BooleanField) में कड़ी मेहनत की गई है। तो, रिक्त = गलत सेट करना चुपचाप असफल हो जाएगा। आपको उन क्षेत्रों के लिए आवश्यक व्यवहार को मजबूर करने के लिए 'self.fields [...] .required = True' फ़ॉर्म के कन्स्ट्रक्टर में उपयोग करना होगा। Https://code.djangoproject.com/ticket/22282 भी देखें। –

3

यह कोई जवाब नहीं है, लेकिन किसी और के लिए जो इसे Google के माध्यम से पाता है, एक और डेटा: यह डेटफिल्ड के साथ मॉडल फॉर्म पर मेरे साथ हो रहा है। इसे गलत पर सेट करने की आवश्यकता है, मॉडल में "शून्य = सही, रिक्त = सही" है और फॉर्म में फ़ील्ड आवश्यक है = गलत अगर मैं इसे साफ़() विधि के दौरान देखता हूं, लेकिन यह अभी भी कह रहा है कि मुझे वैध तिथि चाहिए प्रारूप। मैं किसी विशेष विजेट का उपयोग नहीं कर रहा हूं और मुझे "वैध दिनांक दर्ज करें" संदेश मिलता है जब भी मैं स्पष्ट रूप से input_formats = ['% Y-% m-% d', '% m /% d /% y' सेट करता हूं, ' फॉर्म फ़ील्ड पर% m /% d /% y ',' ']।

संपादित करें: पता नहीं है कि यह किसी और की मदद करेगा, लेकिन मैंने जिस समस्या का सामना किया था, उसे हल किया। हमारे फॉर्म में फ़ील्ड में कुछ डिफ़ॉल्ट टेक्स्ट है (इस मामले में, फ़ील्ड को इंगित करने के लिए "टू" शब्द अंतिम तिथि है; फ़ील्ड को "end_time" कहा जाता है)। मैं विशेष रूप से फॉर्म की क्लीन() विधि में "टू" शब्द की तलाश कर रहा था (मैंने clean_end_time() विधि भी कोशिश की थी, लेकिन इसे कभी नहीं बुलाया गया था) और this Django ticket में सुझाए गए अनुसार क्लीन_डाटा वैरिएबल का मान सेट नहीं किया गया था। हालांकि, उस मॉडल में से कोई भी (मुझे लगता है) मॉडल की मान्यता पहले से ही "इसे" के अमान्य दिनांक प्रारूप पर पक्की नहीं कर दी गई है, जिससे मुझे इसे रोकने का मौका दिया गया है।

+0

क्या आपने इसे हल किया है? – Don

+0

शायद यह फिक्स मदद कर सकता है: https://code.djangoproject.com/ticket/13390 – Don

3

DataGreed के जवाब में विस्तार करते हुए, मैं एक Mixin है कि आप पर एक fields_required चर निर्दिष्ट कर सकते हैं बनाया Meta इस तरह की कक्षा:

class MyForm(RequiredFieldsMixin, ModelForm): 

    class Meta: 
     model = MyModel 
     fields = ['field1', 'field2'] 
     fields_required = ['field1'] 

यहां है:

class RequiredFieldsMixin(): 

    def __init__(self, *args, **kwargs): 

     super().__init__(*args, **kwargs) 

     fields_required = getattr(self.Meta, 'fields_required', None) 

     if fields_required: 
      for key in self.fields: 
       if key not in fields_required: 
        self.fields[key].required = False 
+0

क्या होगा यदि इस मिश्रण का उपयोगकर्ता '__init__' को ओवरराइड करेगा? क्या मिश्रण अभी भी काम करेगा? कैसे एकाधिक विरासत का समाधान किया जाएगा? – user3599803

+0

@ user3599803 जब आप '__init__' को ओवरराइड करते हैं तो आपको हमेशा 'सुपर()' को कॉल करना चाहिए, जैसा कि यह मेरे स्निपेट में किया गया है। – rednaw

+0

तो अगर मैं समझता हूं- मैं एक फॉर्म और सबक्लास माईफॉर्म बना देता हूं। मैं init() से सुपर कॉल करता हूं, जो मिक्स्ड इनिट को कॉल करेगा, लेकिन जब djangl फॉर्म init को बुलाया जाता है? – user3599803

0
model field documentation से

,

आप नीचे दिखाए अनुसार एक मॉडल है, तो

class Article(models.Model): 
    headline = models.CharField(
     max_length=200, 
     null=True, 
     blank=True, 
     help_text='Use puns liberally', 
    ) 
    content = models.TextField() 

आप मॉडल के रूप में required=True बजाय blank=False के शीर्षक के रूप मान्यता को बदल सकते हैं नीचे दिखाए गए क्षेत्र को परिभाषित करने के रूप में।

class ArticleForm(ModelForm): 
    headline = MyFormField(
     max_length=200, 
     required=False, 
     help_text='Use puns liberally', 
    ) 

    class Meta: 
     model = Article 
     fields = ['headline', 'content'] 

तो सवाल का जवाब देने,

class CircuitForm(ModelForm): 
    begin = forms.DateTimeField(required=False) 
    end = forms.DateTimeField(required=False) 
     class Meta: 
      model = Circuit 
      exclude = ('lastPaged',) 

इस बनाता है begin और endrequired=False

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