有一种情况,我需要在几种情况下重用相同的ModelForm(名称的EngagementForm(,但想要禁用某些字段取决于情况。所以我在表格中申请了残疾人
# 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在我执行提交时抛出验证错误。表单.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.']}
检查他们的值,似乎被禁用拿走了他们的值(或者我可能错了(:
(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,但并没有解决这个问题。