【问题标题】:How to log all Django form validation errors?如何记录所有 Django 表单验证错误?
【发布时间】:2013-12-30 05:06:25
【问题描述】:

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

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

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

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

import logging
logger = logging.getLogger(__name__)

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

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    您可以扩展您的 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)
    

    警告:在 Django add_error 将无济于事。

    【讨论】:

    • 对于覆盖 add_error 方法,值得一提的是,该方法是当前 Django 开发版本中的新方法。
    • @Ghopper21 确实,谢谢!这可能会令人困惑,因为我的解决方案只会在旧版本中静默失败。
    • 我使用的是 Django 1.5.4。我尝试使用上述第一种技术。它似乎没有任何效果。有什么想法吗?
    猜你喜欢
    • 2016-03-20
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2015-08-24
    • 1970-01-01
    • 2017-08-02
    相关资源
    最近更新 更多