2013-01-11 6 views
5

मैं Django 1.4 का उपयोग कर रहा हूं और मैं फॉर्मसेट्स के साथ संघर्ष कर रहा हूं। मैंने प्रलेखन और बहुत सारे प्रश्नों को पढ़ा है। मैं संकेतों से बाहर निकल रहा हूं कि वे वास्तव में कैसे काम करते हैं।डीजेगो फॉर्मसेट्स - कैसे एक फॉर्मेट सही तरीके से बनाने और इसे वैध करने के लिए?

- Fomsets इस तरह कॉन्फ़िगर/dclared किया जाना चाहिए?

मैंने फ़ॉर्म.py और views.py में फॉर्मेट कैसे सेट अप किया है।

forms.py: (मैं एक forms.Form घोषित किया है)

class BicycleAdItemKindPropertyValueForm(forms.Form): 
    bicycleaditemkindpropertyvalue = forms.ChoiceField() 

views.py:

def submit_ad_view(request): 

    # This class is used to make empty formset forms required 
    class BicycleAdItemKindPropertyValueFormSet(BaseFormSet): 
     def __init__(self, *args, **kwargs): 
      super(BicycleAdItemKindPropertyValueFormSet, self).__init__(*args, **kwargs) 
      for form in self.forms: 
       form.empty_permitted = False 

     def clean(self): 
      pdb.set_trace() 
      for form in self.forms: 
       None 
      #form.fields['bicycleaditemkindpropertyvalue'] 

    formsetBicycleAdItemKindPropertyValue = formset_factory(BicycleAdItemKindPropertyValueForm, formset=BicycleAdItemKindPropertyValueFormSet) 

    if request.method == 'POST':  
     model_main = Main() 
     model_main.section = Section.objects.get(pk=request.POST['section']) 
     model_main.user = request.user 

     model_bicyclead = BicycleAd() 
     model_bicyclead.bicycleadtype = BicycleAdType.objects.get(pk=2) #1-Ad Link, 2-Ad Insite. Em principio ficara pre-definido 
     model_bicyclead.bicycleaditemkind = BicycleAdItemKind.objects.get(pk=4) 
     model_bicyclead.bicycleadcondition = BicycleAdCondition.objects.get(pk=2) 
     model_bicyclead.city = GeonamesLocal.objects.get(pk=4803854) 

     # Build the forms 
     form_main = MainForm(request.POST, instance = model_main) 
     form_bicyclead = BicycleAdForm(request.POST, instance = model_bicyclead) 
     form_bicycleadcategory = BicycleAdCategoryForm(request.POST) 
     form_bicycleaditemkindselect = BicycleAdItemKindSelectForm(request.POST) 
     formset_bicycleaditemkindpropertyvalue = formsetBicycleAdItemKindPropertyValue(request.POST) 

     #pdb.set_trace() 

     if form_main.is_valid() and form_bicyclead.is_valid() and form_bicycleadcategory.is_valid() and form_bicycleaditemkindselect.is_valid() and formset_bicycleaditemkindpropertyvalue.is_valid(): 
      main_f = form_main.save() 

      bicyclead_f = form_bicyclead.save(commit=False) 
      bicyclead_f.main = main_f 
      bicyclead_f.save() 

      bicycleadcategory_f = form_bicycleadcategory.save(commit=False, rel_obj=model_bicyclead) 


    else: 
     # Build the forms 
     form_main = MainForm() 
     form_bicyclead = BicycleAdForm() 
     form_bicycleadcategory = BicycleAdCategoryForm() 
     form_bicycleaditemkindselect = BicycleAdItemKindSelectForm() 
     formset_bicycleaditemkindpropertyvalue = formsetBicycleAdItemKindPropertyValue() 

    return render_to_response('app/submit/submit_ad.html', {'form_main': form_main, 'form_bicyclead': form_bicyclead, 'form_bicycleadcategory': form_bicycleadcategory, 'form_bicycleaditemkindselect': form_bicycleaditemkindselect, 'formset_bicycleaditemkindpropertyvalue': formset_bicycleaditemkindpropertyvalue}, context_instance=RequestContext(request)) 

इन दो पूर्ववर्ती चरणों सही हैं? स्वरूप सही ढंग से घोषित किया गया है?

अब, टेम्पलेट। मैं इस तरह की घोषणा की है:

sometemplate.html:

<form action="/submeter/anuncio/" method="post"><div style="display: none;"><input type="hidden" value="3TWjKpqnXG7afZcvF1YmmWcRBKnYqePB" name="csrfmiddlewaretoken"></div> 
...   
     <div class="someclass"> 
      <input type="hidden" id="id_form-TOTAL_FORMS" value="1" name="form-TOTAL_FORMS"> 
      <input type="hidden" id="id_form-INITIAL_FORMS" value="0" name="form-INITIAL_FORMS"> 
      <input type="hidden" id="id_form-MAX_NUM_FORMS" name="form-MAX_NUM_FORMS"> 
      [] 
      <div class="item-bicycleaditemkindpropertyvalue"> 
       <label for="id_form-0-bicycleaditemkindpropertyvalue">Some 0</label> 
       <select id="id_form-0-bicycleaditemkindpropertyvalue" name="form-0-bicycleaditemkindpropertyvalue"> 
        ... 
       </select> 
      </div><div class="item-bicycleaditemkindpropertyvalue"> 
       <label for="id_form-1-bicycleaditemkindpropertyvalue">Some 1</label> 
       <select id="id_form-1-bicycleaditemkindpropertyvalue" name="form-1-bicycleaditemkindpropertyvalue"> 
        ... 
       </select> 
      </div> 
      <div class="item-bicycleaditemkindpropertyvalue"> 
       <label for="id_form-2-bicycleaditemkindpropertyvalue">Some 2</label> 
       <select id="id_form-2-bicycleaditemkindpropertyvalue" name="form-2-bicycleaditemkindpropertyvalue"> 
        ... 
       </select> 
      </div>  
     </div> 
     <input type="submit"> 
</form> 

यह उत्पादन सही है:

{{formset_bicycleaditemkindpropertyvalue.management_form}} 
{{formset_bicycleaditemkindpropertyvalue.non_form_errors}} 
{{formset_bicycleaditemkindpropertyvalue.errors}} 
{% for form in formset_bicycleaditemkindpropertyvalue.forms %} 
<div class="item-bicycleaditemkindpropertyvalue"> 
    <label for="{{form.bicycleaditemkindpropertyvalue.auto_id}}"></label> 
    {{form.bicycleaditemkindpropertyvalue}} 
</div> 
जावास्क्रिप्ट की मदद से

, कोड कुछ इस तरह उत्पन्न होगा? ऐसा दिखना चाहिए?

- प्रमाणीकरण, फ़ॉर्मेट को वैध कैसे करें?

अब सत्यापन के बारे में। मैं अपने फार्म में एक forms.ChoiceField() है

class BicycleAdItemKindPropertyValueForm(forms.Form): 
    bicycleaditemkindpropertyvalue = forms.ChoiceField() 

मैं पढ़ा है कि forms.ChoiceField() विकल्पों की एक सूची के खिलाफ मान्य किया जाना चाहिए। मेरा सवाल यह है कि मैं यह कैसे कर सकता हूं?

- कुछ जानकारी

डिबगिंग स्वच्छ में pdb (अजगर debuger)() मैं देख रहा हूँ मैं इस डेटा मिला का उपयोग करना:

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

    def clean(self): 
     pdb.set_trace() 
     for form in self.forms: 
      None 
     #form.fields['bicycleaditemkindpropertyvalue'] 

डिबगिंग self.data:

(Pdb) self.data 
<QueryDict: {u'form-1-bicycleaditemkindpropertyvalue': [u'29'], 
      u'form-2-bicycleaditemkindpropertyvalue': [u'33'], 
      u'title': [u'adasd'], 
      u'form-MAX_NUM_FORMS': [u''], 
      u'country': [u'42'], 
      u'section': [u'5'], 
      u'item_kind': [u'4'], 
      u'form-INITIAL_FORMS': [u'0'], 
      u'bicycleadcategorytype': [u'3', u'2'], 
      u'csrfmiddlewaretoken': [u'3TWjKpqnXG7afZcvF1YmmWcRBKnYqePB'], 
      u'form-TOTAL_FORMS': [u'3'], 
      u'form-0-bicycleaditemkindpropertyvalue': [u'4']}> 

डिबगिंग self.is_valid():

(Pdb) self.is_valid() 
False 

पर कोई सुराग मैं इस formset कैसे मान्य कर सकते हैं?

शुभकामनाओं सहित,

उत्तर

0

formset उपरोक्त कोड में सही ढंग से घोषित किया जाता है। इसके अलावा, उत्पन्न आउटपुट यह है कि आदर्श रूप से एक फॉर्मेट इसे कैसे उत्पन्न करता है। फॉर्म को सत्यापित करने के संबंध में, आप बस कर सकते हैं।

for form in formset: 
    if form.is_valid(): 
     # If is valid do something here 
    else: 
     # Do something Else 

यदि आप अपने दम पर मान्यता सामान करना चाहते हैं, तो आप form वर्ग के अंतर्गत clean विधि ओवरराइड कर सकते हैं के रूप में इस विधि is_valid विधि द्वारा कहा जाता है।

class BicycleAdItemKindPropertyValueForm(forms.Form): 
    bicycleaditemkindpropertyvalue = forms.ChoiceField() 


    def clean(self): 
     # Do field validation here. 

आप को मान्य करने के लिए देख रहे हैं और केवल एक ही क्षेत्र इस प्रकार आप clean_field विधि ओवरराइड कर सकते हैं, तो:

class BicycleAdItemKindPropertyValueForm(forms.Form): 
    bicycleaditemkindpropertyvalue = forms.ChoiceField() 

    def clean_bicycleaditemkindpropertyvalue(self): 
     # Do single field validation here. 
+0

प्रपत्र मैं बदल दिया है में करने के लिए "bicycleaditemkindpropertyvalue = forms.CharField (विजेट = फॉर्म। चयन करें()) "और अब मैं साफ कर सकता हूं । धन्यवाद। –

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