首页 > 解决方案 > Django表单复选框选择不起作用

问题描述

我有一个带有“接受服务条款”复选框的 Django 表单,但如果我选中它,我的应用程序会阻止请求并显示“您必须接受我们的服务条款”消息。


这是我的代码:

表格.py

class ProfileModelForm(ModelForm):

    class Meta:
        model = UserProfile
        fields = ['u_fullname',
              'u_job',
              'u_country',
              'u_email',
              'u_terms',
              ]

    def clean(self):
        cleaned_data = super(ProfileModelForm, self).clean()
        u_fullname = cleaned_data.get('u_fullname')
        u_job = cleaned_data.get('u_job')
        u_country = cleaned_data.get('u_country')
        u_email = cleaned_data.get('u_email')
        u_terms = cleaned_data.get('u_terms')
        if not u_terms:
            raise forms.ValidationError("Please read and accept our Terms of Service")

        if not u_fullname and not u_job and not u_country and not u_terms:
            raise forms.ValidationError('You have to write something!')

        return cleaned_data

字段 u_terms 在我的模型中是一个布尔字段。

意见.py:

    if request.method == 'POST':
    if 'user_reg' in request.POST:
        form = ProfileModelForm(request.POST)
        if form.is_valid():
            instance = form.save(commit=False)
            #Create user and get the id
            n_user = User.objects.create_user(username=request.POST['u_email'],
                                            email=request.POST['u_email'],
                                            password=request.POST['u_password'])
            instance.user = User.objects.get(id=n_user.id)
            instance.u_profile = 'U'
            print("TERMS-->",request.POST['u_terms'])
            instance.save()
            return  # Put return here
        else:
            messages.error(request, "Error")
            #form = ProfileModelForm()

        return render(request, 'login.html', {'form': form})

    elif 'register' in request.POST:
        pass
    elif 'company' in request.POST:
        pass

以及与我的复选框相关的 html 模板部分:

<div class="col-lg-12 no-pdd">
    <div class="checky-sec st2">
        <div class="fgt-sec">
            <input type="checkbox" name="cc" id="c2" value={{ form.u_terms }}>
            <label for="c2">
                <span></span>
            </label>
            <small>Yes, I understand and agree to the workwise Terms & Conditions.</small>
        </div><!--fgt-sec end-->
    </div>
</div>

我想问题出在我的 html 部分,但我不知道如何从复选框管理布尔字段。

有人可以帮助我吗?

标签: pythondjangodjango-forms

解决方案


您元素的“名称”属性与<input>表单预期的 POST 属性不匹配:cc!= u_terms

您可以通过两种方式解决此问题:

  • 用于{{ form.u_terms }}渲染整个<input>标签。请注意,您将其放入 value 属性中,这是错误的(查看浏览器中的源代码,您会明白我的意思)。

    {{ form.u_terms }}
    {{ form.u_terms.label_tag }}
    
  • 如果您必须自定义您的属性<input>(这里似乎不是这种情况),请确保您仍然引用表单的字段,以便各种属性正确:

    <input type="checkbox" name="{{ form.u_terms.html_name }}" id="{{ form.u_terms.id_for_label }}" class="some-custom-class">
    <label for="{{ form.u_terms.id_for_label }}"><span></span></label>
    

推荐阅读