【问题标题】:Django form won't bind to POST dataDjango 表单不会绑定到 POST 数据
【发布时间】: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


【解决方案1】:

您似乎忘记调用超级初始化。当您覆盖 init 函数时,您希望表单类如何正常工作?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2017-12-11
    相关资源
    最近更新 更多