django - 如果选择了单选按钮,则仅检查 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 中解决。
谢谢!
解决方案
您需要编写一个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/
推荐阅读
- java - WebLogic java.lang.IllegalArgumentException
- python - 循环过滤的数据帧
- regex - 如果不存在,正则表达式在引号周围添加空格?
- c++ - 将 Makefile 生成的多个对象文件链接到 CMake 子目录
- c# - 转换 web api 结果时获取不正确的日期
- java - 如何加密和解密大型视频文件
- python - 如何解决此错误值的长度与索引的长度不匹配
- java - 当使用非线程安全类是创建多个对象并将其传递给每个线程的可行设计时?
- javascript - 如何获取变量作为从控制器到 JavaScript 的响应?
- tesseract - “无法为 lang 加载任何 lstm 特定的字典” tesseract 4.1