如何记录所有Django表单验证错误?

时间:2013-12-30 05:06:26

标签: django django-forms

在我的Django应用程序中,我有一个forms.py文件,在其中我定义了与表单输入屏幕相对应的类的加载。这些类中的每一个都在特定于属性/字段的_clean()函数或表单类的整个clean()函数中进行一些验证。如果在任何这些clean()函数中验证失败,我会引发如下错误:

raise forms.ValidationError('Invalid value dude!!')                

当出现此类错误时,应用程序会捕获错误并将其显示在用户的表单上。

我还在这个文件的顶部定义了一个记录器,如下所示:

import logging
logger = logging.getLogger(__name__)

现在,除了向用户报告ValidationErrors之外,我还想捕获它们并将它们记录为错误。是否有一些通用而优雅的方法我可以让记录器记录所有这些错误,而不会改变影响应用程序用户的任何其他行为?

1 个答案:

答案 0 :(得分:2)

您可以扩展Forms以在验证结束后立即记录错误:

class LoggingMixin(object):
    def full_clean(self):
        super(LoggingMixin, self).full_clean()
        for field, errors in self.errors.iteritems():
            logger.info('Form error in %s: %s', ', '.join(errors))

然后使用logging mixin:

定义表单
class MyForm(LoggingMixin, forms.Form):
    ...

当Django 1.7出局时,您还可以在引发异常消息时捕获它们。这将为您提供原始异常(Form进行更多检查):

class LoggingMixin(object):
    def add_error(self, field, error):
        if field:
            logger.info('Form error on field %s: %s', field, error)
        else:
            logger.info('Form error: %s', error)
        super(LoggingMixin, self).add_error(field, error)

警告:使用add_error将无法在Django< = 1.6中执行任何操作。