2010-03-09 13 views
30

ये फॉर्मेट विपरीत व्यवहार जो मैं चाहता हूं प्रदर्शित कर रहा हूं।डीजेगो फॉर्मेट्स: पहले आवश्यक बनाना?

def post(request): # TODO: handle vehicle formset 
    VehicleFormSetFactory = formset_factory(VehicleForm, extra=1) 
    if request.POST: 
     vehicles_formset = VehicleFormSetFactory(request.POST) 
    else: 
     vehicles_formset = VehicleFormSetFactory() 

और मेरे टेम्पलेट इस तरह दिखता है:

मेरा विचार ऊपर इस तरह सेट किया गया है

<div id="vehicle_forms"> 
     {{ vehicles_formset.management_form }} 
     {% for form in vehicles_formset.forms %} 
      <h4>Vehicle {{forloop.counter}}</h4> 
      <table> 
       {% include "form.html" %} 
      </table> 
     {% endfor %} 
    </div> 

इस तरह यह शुरू में केवल 1 प्रपत्र उत्पन्न करता है, जैसे मैं चाहता हूँ। लेकिन मैं चाहता हूं कि एक फॉर्म की आवश्यकता हो!

जब मैं गतिशील रूप से जावास्क्रिप्ट और vehicles_formset.empty_form के साथ खाली रूपों को जोड़ता हूं तो उन सभी अतिरिक्त रूपों की आवश्यकता होती है, जिन्हें मैं नहीं चाहता हूं।

डॉक्स से

:

formset बहुत चालाक अतिरिक्त रूपों है कि परिवर्तित नहीं किया गया अनदेखी करने के लिए है।

यह पहला व्यवहार है जो मैं प्रदर्शित करता हूं (जो मैं चाहता हूं) नहीं बल्कि व्यवहार जो अतिरिक्त रूप प्रदर्शित कर रहे हैं (जो मैं चाहता हूं)।

क्या कुछ विशेषता है जो मैं कम से कम एक फ़ॉर्म में बदल सकता हूं?

+0

@ mpen हालांकि मैं पार्टी के लिए देर हो रही है, मैं सोच रहा था एक अलग मुद्दे के बारे में जाने के लिए कैसे कि मुझे यहां मेरे प्रश्न का सामना करना पड़ रहा है (https://stackoverflow.com/questions/44159559/need-to-have-a-required-and-optional-fields-in-django-formset) – dungu

+0

@kedric आप पूछ रहे हैं गलत आदमी मैंने इस सवाल को पोस्ट करने के तुरंत बाद Django का उपयोग नहीं किया है। – mpen

+0

ओह, ठीक है 0 प्रतिक्रिया के लिए धन्यवाद – dungu

उत्तर

65

मिले एक बेहतर समाधान:

class RequiredFormSet(BaseFormSet): 
    def __init__(self, *args, **kwargs): 
     super(RequiredFormSet, self).__init__(*args, **kwargs) 
     for form in self.forms: 
      form.empty_permitted = False 

तो इस तरह से अपनी formset बनाने के लिए:

MyFormSet = formset_factory(MyForm, formset=RequiredFormSet) 

मैं वास्तव में क्यों इस के साथ शुरू करने के लिए एक विकल्प नहीं था पता नहीं है .. । जो कुछ भी लेकिन। यह पता लगाने के लिए केवल मेरे जीवन के कुछ घंटे लग गए।

इससे सभी फॉर्म आवश्यक होंगे।आप self.forms[0].empty_permitted से False पर सेट करके केवल पहला व्यक्ति बना सकते हैं।

+1

यह Django के सबसे कष्टप्रद हिस्सों में से एक का समाधान है, यह अतुलनीय है कि यह प्रलेखन का हिस्सा क्यों नहीं है – YPCrumble

+0

किसी कारण से, मुझे खाली_प्रर्मित करने के लिए एक विशिष्ट फ़ॉर्म सेट करने का प्रयास करते समय एक कुंजी त्रुटि मिलती है। उदाहरण के लिए "फॉर्म [0] .empty_permitted = गलत" एक त्रुटि देता है। –

+0

@Zorpix 'self.forms होना चाहिए [0]' मुझे लगता है, मानते हैं कि आपके पास कम से कम एक रूप है। – mpen

1

ओह मुझे लगता है कि मैं देखता हूं। इस प्रयास करें:

from django.forms.formsets import BaseFormSet, formset_factory 
class OneExtraRequiredFormSet(BaseFormSet): 
    def initial_form_count(self): 
     return max(super(OneExtraRequiredFormSet,self).initial_form_count() - 1,0) 

VehicleFormSetFactory = formset_factory(VehicleForm, formset=OneExtraRequiredFormSet, extra=1) 

== नीचे == मूल जवाब

जब आप कहते हैं, मुझे लगता है तुम्हारा मतलब "केवल एक अतिरिक्त फार्म की आवश्यकता बनाने के लिए, कितने है की परवाह किए बिना" कम से कम कर एक फार्म की आवश्यकता " जावास्क्रिप्ट के माध्यम से जोड़ा गया है "।

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

+0

काफी नहीं ... अब जावास्क्रिप्ट को अनदेखा कर रहा है, एक और केवल एक फॉर्म प्रदर्शित होता है (अतिरिक्त = 1, कोई प्रारंभिक डेटा नहीं)। वह * एक * रूप आवश्यक नहीं है - मैं चाहता हूं कि यह हो। जेएस के माध्यम से जोड़े गए किसी भी रूप को * कभी * आवश्यक नहीं होना चाहिए। – mpen

+0

क्या मेरा संपादन मदद करता है? – Wogan

+0

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

9

अच्छा ... यह पहला फॉर्म आवश्यक बनाता है।

class RequiredFormSet(BaseFormSet): 
    def clean(self): 
     if any(self.errors): 
      return 
     if not self.forms[0].has_changed(): 
      raise forms.ValidationError('Please add at least one vehicle.') 

केवल "समस्या" है कि अगर वहाँ 0 रूपों को दर्शाते हैं तो clean विधि सब पर बुलाया पाने के लिए प्रतीत नहीं होता है, इसलिए मैं कैसे अगर वहाँ 0. सच कर रहे हैं की जाँच करने के पता नहीं है .. हालांकि यह कभी नहीं होना चाहिए (सिवाय इसके कि मेरे जेएस में एक बग है, जिससे आप सभी रूपों को हटा सकते हैं)।

+1

यदि आप वस्तुओं के मौजूदा सेट को संपादित करने के लिए इस फ़ॉर्म का उपयोग करते हैं, तो आपको हमेशा पहले अपडेट करने के लिए मजबूर किया जाएगा। यह केवल सृजन के लिए उपयुक्त है, अद्यतन नहीं है। –

+0

@ डैनियल पाम, क्या आपके पास समाधान है? मुझे भी एक ही समस्या है। –

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