首页 > 解决方案 > 如果选择了单选按钮,则仅检查 Django 表单

问题描述

我在 Django 结帐页面中获得了一张表格,用户可以在其中选择是否将他们的产品运送到常规地址或他/她想要的另一个地址。

案例是:如果用户使用的是普通地址,有些字段是不需要填写的。否则,如果客户选择运送到另一个地址,Django 必须检查所有表单字段是否正确填写。

我的表格.py:

class ProfileRegistrationForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('date_of_birth', 'cep', 'rua', 'numero', 'bairro',
                  'complemento', 'cidade', 'estado')

        labels = {'date_of_birth': 'Data de nascimento',
                  'cep': 'CEP',
                  'numero': 'Nº'}

        widgets = {'date_of_birth': forms.TextInput(attrs={'id': 'date_of_birth',
                                                           'OnKeyPress': 'formatar("##/##/##", this)',
                                                           'maxlength': "8",
                                                           'placeholder': '__/__/__', 'class': 'form-control'}),
                   'cep': forms.TextInput(attrs={'id': 'cep',
                                                 'onblur': 'pesquisacep(this.value)',
                                                 'OnKeyPress': 'formatar("#####-###", this)',
                                                 'placeholder': '______-___',
                                                 'class': 'form-control'}),
                   'rua': forms.TextInput(attrs={'readonly': 'readonly', 'id': 'rua', 'class': 'form-control'}),
                   'bairro': forms.TextInput(attrs={'readonly': 'readonly', 'id': 'bairro', 'class': 'form-control'}),
                   'cidade': forms.TextInput(attrs={'readonly': 'readonly', 'id': 'cidade', 'class': 'form-control'}),
                   'estado': forms.TextInput(attrs={'readonly': 'readonly', 'id': 'uf', 'class': 'form-control'}),
                   'numero': forms.TextInput(attrs={'id': 'numero', 'class': 'form-control', 'placeholder': 'Nº'}),
                   'complemento': forms.TextInput(attrs={'id': 'complemento', 'class': 'form-control', 'placeholder': 'Complemento'}),}

checkout.html 模板:

  <form action="" method="post" id="payment-form">
    <div class="box-element" id="form-wrapper">
            <div id="user-info">
                <p><strong>{{ user.username }}</strong>, confira abaixo o endereço de entrega:</p>
                <p><input type="radio" name="address" checked="checked"> Endereço de entrega:<br>
                    {{ user.profile.rua }}, nº {{ user.profile.numero }} - {{ user.profile.complemento }}<br>
                    {{ user.profile.bairro }}<br>
                    {{ user.profile.cidade}}/{{ user.profile.estado }}<br>
                    CEP: {{ user.profile.cep }}

                </p>
            </div>


            <div id="shipping-info">
                <hr>
                <p><input type="radio" name="address">
                    Desejo alterar o endereço de recebimento:</p>
                <div class="form-field">
                    {{ address_form.cep.label_tag }} {{ address_form.cep }}
                </div>
                <div class="form-field">
                    {{ address_form.rua }}
                </div>
                <div class="form-field">
                    {{ address_form.numero }}
                </div>
                <div class="form-field">
                    {{ address_form.complemento }}
                </div>
                <div class="form-field">
                    {{ address_form.cidade }}
                </div>
                <div class="form-field">
                    {{ address_form.estado }}
                </div>
                <hr>


                    {% csrf_token %}

                  <div class="form-group">

                      <label for="card-element">Insira as informações do seu cartão de crédito:</label>

                    <div id="card-element" class="form-control">

                    </div>


                    <div id="card-errors" role="alert"></div>
                  </div>
            </div>
            <hr>
            <input id="form-button" class="btn btn-success btn-block" type="submit" value="Finalizar a compra">
    </div>
  </form>

只有当用户检查了第二个单选按钮时,Django 是否有机会检查另一个地址字段?

我知道我可以手动制作表单字段,然后检查视图中的所有字段。但我想知道这是否可以在 forms.py 中解决。

只是为了说明当前的结帐网页: 在此处输入图像描述

谢谢!

标签: djangoforms

解决方案


您需要编写一个clean方法来运行表单验证。

我还将您的单选按钮更改为表单的一部分,而不是模板中的原始 HTML。如果这样更容易,甚至可以将其设置为复选框或选择框。

我有一个以非常相似的方式工作的表格,为地址提供了一个选项来进行运输和计费。

下面是 clean 方法的示例,其中billing_address_choice是一个选择字段,允许用户为新地址选择“新”或从系统中已有的地址中选择。如果选择是“新的”,那么它会检查以确保计费字段包含数据。

def clean(self):
    """
    Custom form cleaning
    """
    cleaned_data = super().clean()

    billing_address_choice = cleaned_data.get('billing_address_choice')
    if billing_address_choice == 'new':
        # a new billing address has been entered, enforce required-ness
        for field in (
                'billing_address1',
                'billing_city',
                'billing_state',
                'billing_country',
                'billing_postcode',
        ):
            if not cleaned_data.get(field):
                self.add_error(field, _('This field is required'))

可以在此处找到有关表单验证的文档;https://docs.djangoproject.com/en/3.0/ref/forms/validation/


推荐阅读