我有一个自定义的引导程序窗体,该窗体显示在仪表板上。问题是,当用户转到仪表板时,即使他尚未提交表单(该字段为必填字段),他也会立即看到验证错误。
我不明白为什么会这样,感谢您的帮助! :) 问题图片(我不希望仅在提交后才显示红色的“必填字段”消息):
表格:
'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?")
答案 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,
},
)