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

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

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

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

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

import logging
logger = logging.getLogger(__name__)

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

最佳答案 您可以扩展表单以在验证结束后立即记录错误:

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出局时,您还可以在引发异常消息时捕获它们.这将为您提供原始异常(表单会进行更多检查):

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中执行任何操作.

点赞