2016-04-22 13 views
0

私のPOSTデータをこのフォームにバインドしようとすると本当に苦労しています。 POSTデータは正しく出力されており、正しい形式であるように見えますが、検証のためにフォームにバインドすることは絶対に拒否されます。私はこれに新しいので、私は何かが明らかに欠けていると確信していますが、なぜこれが起こっているのかを理解する助けがあれば幸いです。DjangoフォームはPOSTデータにバインドされません

views.py 
def new_call(request): 

    if not request.user.is_authenticated(): 
     return redirect(login_view) 

    if request.method == "POST":  

     form = RegisterCallForm(request.POST,user=request.user) 

     #Prints False 
     print form.is_bound 

     if form.is_valid(): 
      answered = form.cleaned_data['answered'] 
      left_message = form.cleaned_data['left_message'] 
      contact_pk = form.cleaned_data['contact'] 
      time_called = form.cleaned_data['time_called'] 
      note = form.cleaned_data['note'] 

      staff_person = request.user.userprofile 

      call = Call(
       staff_person=staff_person, 
       contact=contact, 
       answered=answered, 
       left_message=left_message, 
       time=time_called, 
       note=note, 
       ) 

      call.save() 

      if request.POST.get('submit') == 'continue': 
       return redirect(user_profile_view) 
      else: 
       return redirect(new_call) 

    else: 

     form = RegisterCallForm(user=request.user,) 

    return render(request, 'supporttracker/register_call.html',{'form':form}) 

そして、ここでは、フォームの...

forms.py 
class RegisterCallForm(forms.Form): 

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

     self.user = kwargs.pop('user',User) 
     super (RegisterCallForm, self).__init__(*args,**kwargs) 

     self.fields['contact'] = forms.TypedChoiceField(
     choices = get_contact_list(self.user), 
     label = 'Call with', 
     ) 

     new_fields = OrderedDict() 

     new_fields['contact'] = self.fields['contact'] 
     new_fields['answered'] = self.fields['answered'] 
     new_fields['left_message'] = self.fields['left_message'] 
     new_fields['time_called'] = self.fields['time_called'] 
     new_fields['note'] = self.fields['note'] 

     self.fields = new_fields 

    answered = forms.TypedChoiceField(
    label='Answered:', 
    coerce=lambda x: x == 'Yes', 
    choices=((False, 'No'), (True, 'Yes')), 
    widget=forms.RadioSelect 
    ) 

    left_message = forms.TypedChoiceField(
    label='Left a message:', 
    coerce=lambda x: x == 'Yes', 
    choices=((False, 'No'), (True, 'Yes')), 
    widget=forms.RadioSelect 
    ) 

    time_called = forms.DateTimeField(
    label = 'Time of call', 
    initial = datetime.datetime.now, 
    required = False, 
    ) 

    note = forms.CharField(
    max_length=500, 
    widget=forms.Textarea, 
    required=False, 
    ) 
+0

検証に失敗したものを確認するのはそれほど難しいことではありません。 'else 'ブランチを' if form.is_valid() 'に追加して' form.errors'を表示すると、どのフィールドにエラーが出るのかがわかります。 –

+0

私はそれをしても何の誤りもありません。私は 'print form.is_bound'をすでにそこに持っていて、常に' False'を出力します。 – Nikolai0045

+0

あなたのフォームを構成する方法はちょっと変わっています。あなたはそれをなぜ行うのか分からないので、 'self.fields '(それが正しいように見えますが)。あなたの 'request.POST'を印刷しましたか?何かありますか? –

答えて

1

あなたがスーパーのinitを呼び出すことを忘れそうです。あなたがinit関数をオーバーライドするとき、フォームクラスが通常の仕事であるとどう思いますか?

関連する問題