【发布时间】:2016-08-16 11:29:43
【问题描述】:
我真的很难让我的 POST 数据绑定到这个表单。 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,
)
【问题讨论】:
-
检查未通过验证的内容并不难。只需为
if form.is_valid()添加一个else分支,然后在此处打印form.errors,您应该会看到哪个字段给您错误。 -
当我这样做时,我没有收到任何错误。我已经有
print form.is_bound,它总是打印False -
你构建表单的方式有点奇怪我不知道你为什么这样做,所以我不建议重新创建
self.fields(虽然它看起来不错)。你打印了你的request.POST吗?有什么事吗? -
所以我发现,在 1.9 中,现在有一个
forms.order_fields()方法,允许您重新排序表单实例的字段。 link -
这也解决了我的表单绑定问题
标签: django forms django-forms