首页 > 解决方案 > 禁用字段导致 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 #

如果我能得到你们的帮助,我将不胜感激,至少我应该知道我在这里错过了什么。

标签: djangoformsvalidation

解决方案


这里提到了解决方案。由于 HTML 处理 POST 方法的方式,所有禁用的字段都不会传递到后端,导致表单验证错误。

解决方案 #1 解决了我的问题,简单但不优雅的代码。然而,解决方案#2 更优雅 IMO 但并没有解决问题。


推荐阅读