警告(甚至信息消息)而不仅仅是Django中的错误

kmt*_*kmt 8 django warnings

严重性的概念是否存在于Django的表单验证中,还是仅存在错误?

另外,如何抑制警告/错误?

sle*_*anc 8

老问题,但我认为它仍然相关.

这实际上取决于你认为是警告的内容.

  • 您可以在表单中接受部分有效的数据(不要在需要警告的字段上引发ValidationError).然后,使用contrib.messages框架(或类似),您可以在下一页上显示一个警告框(无论是相同的表单页,还是重定向到主页或任何其他页面)
  • 或者,您可能需要确认而不是警告.您可以在创建时动态添加或更改字段,那么为什么不添加隐藏的"我接受风险"复选框,只有在您的表单引发该警告时才需要这些复选框?

    1. 用户加载表单.复选框是隐藏的HTML输入设置为false.
    2. 用户使用提醒警告的数据填写表单.表单再次显示,但现在复选框可见.
    3. 用户复选框然后重新提交表单.
    4. 服务器正确处理数据并忽略警告.

第二个选项的优点是不需要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
Run Code Online (Sandbox Code Playgroud)

在您的视图中,您可以根据需要检查form.errors中的相应错误.

  • 您仍然可以通过执行 `self.add_error('my_field', message)` 将错误添加到 `clean` 中的特定字段 (2认同)

Ris*_*cha 3

Django 表单只能引发 ValidationErrors(请参阅此处)。解决这个问题的一种方法是使用新的消息系统。定义了 5 个消息级别,并且能够定义其他自定义消息级别。

至于抑制错误/警告,您始终可以form.errors在模板中简单地忽略。另请查看clean表单模块中的方法 - 您应该能够抑制其中的一些警告。