严重性的概念是否存在于Django的表单验证中,还是仅存在错误?
另外,如何抑制警告/错误?
答案 0 :(得分:8)
老问题,但我认为它仍然相关。
这实际上取决于你认为是警告的内容。
contrib.messages
框架(或类似),您可以在下一页显示警告框(无论是相同的表单页面,还是重定向到主页或任何其他页面)或者,您可能需要确认而不是警告。您可以在创建时动态添加或更改字段,因此为什么不添加隐藏的"我接受风险"只有在您的表单引发该警告时才需要的复选框?
第二个选项的优点是不需要cookie,它还增加了交互性(由于警告,您的用户可能不想继续...)。
在您的代码中,您所要做的就是:
#views.py
...
if form.is_valid():
# proceed
else:
form.fields["my_checkbox"].widget = widgets.CheckboxInput
# re-display form
...
#forms.py
...
def clean_myfield(self):
# do your cleaning
if (myfield_warning==True) and not (my_checkbox==True):
raise ValidationError("blabla")
else:
return myfield
在您看来,您可以根据需要检查form.errors中的相应错误。
答案 1 :(得分:3)
Django表单只能引发ValidationErrors(参见here)。解决这个问题的一种方法是使用new messaging system。定义了5个级别的消息,可以定义其他自定义消息级别。
至于抑制错误/警告,您可以随时忽略模板中的form.errors
。另请查看表单模块中的clean
方法 - 您应该能够在那里禁止一些警告。
答案 2 :(得分:0)
我在 Django Admin 应用中有类似的要求。在保存可能重复的条目之前,我需要获得用户的确认。我将错误消息本身用作解决方法。在消息中,我添加了隐藏的HTML输入。第二次保存时,此输入以data
的形式出现,在这种情况下,我继续保存跳过警告。
def MyForm(forms.ModelForm):
def clean(self):
if (not self.instance.id and # check only new entries
'warn_possible_duplicate' not in self.data): # on first save this is true
# check if possible duplicate
if possible_duplicate:
self.add_error('dup_field', format_html(
'Similar entry already exists.'
' To add the new entry anyway, please save again.'
'<input type="hidden" id="warn-possible-duplicate"' # inject hidden input with error msg itself
'name="warn_possible_duplicate" value="0"/>' # so it's returned in form `data` on second save
))
这有什么缺陷吗?还有更好的建议吗?