django - 禁用字段导致 Django 中的表单验证错误
问题描述
有一种情况,我需要在几种情况下重用相同的 ModelForm(名称的 EngagementForm),但要禁用某些字段取决于具体情况。所以我在forms.py中应用了禁用:
# Override Field Initialisation, used for disabling fields
def __init__(self, *args, **kwargs):
schedule_check = kwargs.pop('schedule', False)
super(EngagementForm, self).__init__(*args, **kwargs)
# If schedule argument set to True, disable the following fields
if schedule_check:
fields = (
'project_code',
'project_name',
'user_credential',
)
for i in fields:
self.fields[i].disabled = True
self.fields[i].required = False
但是,当我执行提交时,Django 会引发验证错误。form.is_valid() 返回 False,在使用 Pdb 检查错误时,我看到了这一点:
(Pdb) form.errors
{'project_code': ['This field is required.'],
'project_name': ['This field is required.'],
'user_credential': ['This field is required.']}
检查它们的值,似乎disabled带走了它们的值(或者我在这里可能错了):
(Pdb) form['project_code'].value()
(Pdb)
我尝试了一些在线找到的解决方案(包括为每个字段输入初始值),但这些都不能解决这里的问题。
仅供参考,这是views.py中的代码:
def schedule_form(request, pk):
engagement = get_object_or_404(Engagement, pk=pk)
if request.method == "GET":
context = {
'title': "Schedule Task",
'form': EngagementForm(
instance=engagement,
schedule=True,
),
}
return render(request, 'forms/engagement_form.html', context)
else: # POST request
form = EngagementForm(request.POST, instance=engagement)
# Django thinks the form is invalid #
if form.is_valid():
form.save(update_fields=['schedule_date'])
return redirect('index')
else:
# Shows error message
# Django executed this block upon submit #
如果我能得到你们的帮助,我将不胜感激,至少我应该知道我在这里错过了什么。
解决方案
这里提到了解决方案。由于 HTML 处理 POST 方法的方式,所有禁用的字段都不会传递到后端,导致表单验证错误。
解决方案 #1 解决了我的问题,简单但不优雅的代码。然而,解决方案#2 更优雅 IMO 但并没有解决问题。
推荐阅读
- c++ - cin 在 C++ 中不接受带有空格的输入吗?
- asp.net - Saml2RequestException:断言已过期。断言有效的 NotOnOrAfter
- android - RecyclerView 和 cardView onclick
- android - 无需身份验证即可上传到 Firebase Storage 私有存储桶
- go - 如何在路由函数之间传递 var 并在每个控制器中更改它?
- uwp - UWP webview 视频元素未显示
- python - 这是可怕的编程习惯吗?
- excel - 循环子功能
- javascript - 429:请求太多:仅在电报.sendContact 18053 之后重试
- javascript - 在 Post 请求中发送 Authorization 标头