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

Saq*_*Ali 5 django django-forms

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

raise forms.ValidationError('Invalid value dude!!')                
Run Code Online (Sandbox Code Playgroud)

出现此类错误时,应用程序会捕获该错误并将其显示在表单上,​​以供用户使用。

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

import logging
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)

现在,除了向用户报告ValidationErrors外,我还想捕获它们并将它们记录为错误。是否可以通过某种通用且优雅的方法来使记录器记录所有此类错误,而无需更改影响应用程序用户的任何其他行为?

Nic*_*tot 4

您可以扩展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))
Run Code Online (Sandbox Code Playgroud)

然后使用日志混合定义您的表单:

class MyForm(LoggingMixin, forms.Form):
    ...
Run Code Online (Sandbox Code Playgroud)

当 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)
Run Code Online (Sandbox Code Playgroud)

警告add_error在 Django <= 1.6 中使用不会执行任何操作。