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

时间:2010-02-16 04:04:10

标签: django warnings

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

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

3 个答案:

答案 0 :(得分: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

在您看来,您可以根据需要检查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
                ))

这有什么缺陷吗?还有更好的建议吗?