Django表单在提交之前已经过验证

时间:2020-02-01 22:54:45

标签: python django forms bootstrap-4

我有一个自定义的引导程序窗体,该窗体显示在仪表板上。问题是,当用户转到仪表板时,即使他尚未提交表单(该字段为必填字段),他也会立即看到验证错误。

我不明白为什么会这样,感谢您的帮助! :) 问题图片(我不希望仅在提交后才显示红色的“必填字段”消息):

enter image description here

表格:

'makeprg'

观看次数:

:make

模板:

class MinitaskForm(forms.ModelForm):
    class Meta:
        model = Minitask
        fields = ()


    def __init__(
        self,
        data=None,
        files=None,
        auto_id="id_%s",
        prefix=None,
        initial=None,
        error_class=ErrorList,
        label_suffix=None,
        empty_permitted=False,
        instance=None,
        use_required_attribute=None,
        minitask=None,
    ):
        super().__init__(
            data,
            files,
            auto_id,
            prefix,
            initial,
            error_class,
            label_suffix,
            empty_permitted,
            instance,
            use_required_attribute,
        )

        assert minitask is not None

        self.fields["selected_choice"] = forms.CharField(
            widget=forms.RadioSelect(
                choices=[(val, val) for val in minitask.choices]
            ),
            required=False,
            label="Which of these emotions best describes your day?",
        )

        self.fields["reason"] = forms.CharField(label="Why?")

1 个答案:

答案 0 :(得分:1)

您认为:

if request.method == "POST":
    ...
else:
    mini_form = MinitaskForm(
        minitask=minitask,
        data={
            "reason": minitask.reason,
            "selected_choice": minitask.selected_choice,
        },
    )

根据docs

Form实例绑定到一组数据,或者未绑定。

在大多数情况下,表单是通过POST请求从用户那里获取数据的。 (绑定表格)

GET请求向用户提供了表单,以便用数据填充它。 (未绑定表格)

因此,您需要通过GET请求为用户提供未绑定的表格。

在您的代码中,您声明如果请求不是POST(GET请求不是POST),则返回一个绑定形式,该绑定形式填充有您以编程方式提供的数据。

这没有道理。

可能是,如果您在else之后插入breakpoint(),则用./manage.py runserver渲染页面并键入控制台中提供的提示:

minitask.reason == None的结果将是True

上面的意思是您将表单与包含不允许的空原因的数据绑定。

如果您想在unbound form中提供初始数据,可以使用initial

mini_form = MinitaskForm(
    minitask=minitask,
    initial={
        "reason": minitask.reason,
        "selected_choice": minitask.selected_choice,
    },
)