2013-01-11 5 views
5

私はDjango 1.4を使用しています。私はFormsetsに苦労しています。私はドキュメンテーションと多くのSOの質問を読んだ。私は彼らが本当に働く方法の手がかりを得ています。Django Formsets - フォームセットを正しく構築して検証するには?

- Fomsetsはこのように設定/ dclaredする必要がありますか?

私はどのようにform.pyとviews.pyにformsetを設定しましたか?

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)) 

これら2つの上記の手順は正しいですか? formsetは正しく宣言されていますか?

今、テンプレート。それは正しい出力である

<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> 

:コードはこのような何かを生成しますは、JavaScriptの助けを借りて

{{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> 

sometemplate.html:私はこのように宣言しましたか?これはどう?

- 検証、フォームセットを有効にする方法は?

今、検証についてです。私はforms.ChoiceFieldは()選択肢のリストと照合して検証する必要があることを読んだ

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

私は自分のフォームでforms.ChoiceFieldを()しました。私の質問は私がこれをどうやってできるのかということです。

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']}> 
-

きれいで、PDB(Pythonのdebuger)()私は、このデータを得た参照を使用して

をデバッグする一部の情報

デバッグself.is_valid():

(Pdb) self.is_valid() 
False 

このフォームセットを検証するにはどのような手がかりがありますか?

よろしく、上記のコードで

答えて

0

formsetが正しく宣言されています。また、生成される出力は、フォームセットがそれを生成する理想的な方法です。フォームの検証に関しては、単純に行うことができます。

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

自分で検証ものをしたい場合は、このメソッドはis_validメソッドによって呼び出されるように、あなたがformクラスの下cleanメソッドをオーバーライドすることができます。

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


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

あなたが検証し、次のようにclean_fieldメソッドをオーバーライドすることができます唯一の単一のフィールドに探している場合:私は= bicycleaditemkindpropertyvalue = forms.CharField(ウィジェット」に変更した形で

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

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

forms.Select()) "今、私はきれいにすることができます。ありがとう。 –

関連する問題