django - 如何让 Django 表单同时验证多个字段
问题描述
我正在尝试编写一种clean
方法来验证 3 个字段(百分比)是否加起来为零。我按照 django文档将 clean() 方法添加到我的表单类中,但 Django 在表单提交后仍然重定向,表明 is_valid() 函数成功通过。
似乎该clean
方法只是被Django调用is_valid()
并且不允许表单提交......
已经检查了类似的答案,但没有运气。
表格.py
class RequirementsForm(forms.ModelForm):
class Meta:
model = Profile
fields = ('cal_req',
'prot_bool',
'carb_bool',
'fat_bool',
'stf_bool',
'fib_bool',
'sug_bool',
'sod_bool',
'cho_bool',
'clc_bool',
'irn_bool',
'vta_bool',
'vtc_bool',
'prot_perc',
'carb_perc',
'fat_perc',
'stf_g_thr',
'fib_g_req',
'sug_g_thr',
'sod_mg_thr',
'cho_mg_thr',# must opt-in for dietary cholesterol reqs. But default is 300 / Decimal(2000)
'clc_mg_req',
'irn_mg_req',
'vta_mcg_req',
'vtc_mg_req' )
def clean(self):
cleaned_data = super().clean()
prot_perc = cleaned_data.get('prot_perc')
fat_perc = cleaned_data.get('fat_perc')
carb_perc = cleaned_data.get('carb_perc')
if sum([prot_perc, fat_perc, carb_perc]) != 1.0:
raise forms.ValidationError(_('Macro percents must add up to 1!')_)
视图.py
@login_required(login_url='/login/')
def questionaire(request):
prof, created = Profile.objects.get_or_create(user=request.user) # Careful, this clashes with the reciever in models.py
if created:
prof.save()
if request.method=='POST': # Will post requirements form
req_form = RequirementsForm(request.POST, instance=prof)
if req_form.is_valid():
req_form.save()
return HttpResponseRedirect('/')
else:
req_form = RequirementsForm(instance=prof)
context={'req_form':req_form, 'prof':prof}
return render(request, 'core/questionaire_form.html', context)
表单.html
</tr>
<tr>
<th class ='type_label' colspan=6>Macronutrients</th>
</tr>
<tr>
<td class="bool_col"></td>
<td class="nm_col">Protein</td>
<td class="micro_input">
{{req_form.prot_perc}}
</td>
<td>%</td>
<td><input id="prot_g" ></input></td>
<td>{{req_form.prot_perc.errors</td>
</tr>
<tr>
<td class="bool_col"></td>
<td class="nm_col">Fat</td>
<td class="micro_input"> {{req_form.fat_perc}}</td>
<td id="unit1">%</td>
<td><input id="fat_g" ></input></td>
<td></td>
</tr>
<tr>
<td class="bool_col"></td>
<td class="nm_col">Carbohydrates</td>
<td class="micro_input"> {{req_form.carb_perc}}</td>
<td id="unit1">%</td>
<td><input id="carb_g"></input></td>
<td></td>
</tr>
解决方案
这是一个简单的缩进错误。clean 函数应该在类的正下方缩进RequirementsForm
推荐阅读
- html-email - 是否可以使用 mjml 设置容器或包装器宽度?
- typo3 - 如何在 TYPO3 中将压缩和连接的 CSS 移动或包含到页脚?
- python-3.x - 升级 Python 版本以运行和创建 Sagemaker Endpoint 的自定义容器
- amazon-s3 - 拒绝在框架中连接“https://s3.console.aws.amazon.com/”,因为 AWS 是“X-Frame-Options”到“拒绝”
- c# - 将巨大的项目列表作为参数传递给 SQL Server 的最高效方法是什么?
- nextcloud - 在 lxd 中捕捉 nextcloud,apparmor 失败
- python - IsADirectoryError: [Errno 21] 是一个目录:
- python - Leetcode: 14. 最长公共前缀
- c# - 使用 C# 比较两个文件夹中的文件
- database - Visual Studio 上没有模板