【问题标题】:Django: How to check if there are field errors from within custom widget definition?Django:如何检查自定义小部件定义中是否存在字段错误?
【发布时间】:2011-03-13 22:07:13
【问题描述】:

我想创建小部件,当相关字段出现错误时,将特定类添加到元素标记中。

我很难从小部件定义代码中找到有关如何检查字段是否存在相关错误的信息。

目前我有以下存根小部件代码(最终小部件将使用更复杂的标记)。

from django import forms
from django.utils.safestring import mark_safe
class CustomTextWidget(forms.Widget):
        def render(self, name, value, attrs):
            field_has_errors=False # change to dynamically reflect field errors, somehow
            if field_has_errors:
                error_class_string="error"
            else:
                error_class_string="" 
            return mark_safe(
            "<input type=\"text\" class=\"%s\" value=\"%s\" id=\"id_%s\" name=\"%s\">" % (error_class_string, value, name, name)
            )

任何人都可以阐明在此处填充 field_has_errors 布尔值的明智方法吗? (或者也许建议一种更好的方法来完成我正在尝试做的事情)。提前致谢。

【问题讨论】:

    标签: django django-forms django-widget


    【解决方案1】:

    小部件不知道它所应用的字段。它是维护有关错误信息的字段。您可以在表单的 init 方法中检查 error_messages,并相应地向您的小部件注入错误类:

    class YourForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super(YourForm, self).__init__(*args, **kwargs)    
            attrs = {}
            if self.fields['your_field'].error_messages is not None:
                attrs['class'] = 'errors'
            self.fields['your_field'].widget = YourWidget(attrs=attrs)
    

    【讨论】:

    • 更好的 DRY 答案
    【解决方案2】:

    正如 Jason 所说,小部件无法访问该字段本身。我认为更好的解决方案是使用 CSS 的级联特性。

    {% for field in form %}
    <div class="field{% if field.errors %} field_error{% endif %}">
    {{ field }}
    </div>
    {% endfor %}
    

    现在你可以在你的 CSS 中做:

    div.field_error input { color: red }
    

    或任何你需要的。

    【讨论】:

    • 这绝对是要走的路,实际上也是我在自己的工作中一直采用的方法。我提供的示例是拼凑在一起的,目的是展示将​​属性传递给小部件(不仅仅是自定义小部件),但是应该避免它,因为它不是 DRY。
    • 两年后它帮助了我。谢谢你:)
    • 为什么他们不将错误信息传递给小部件呢?对我来说这似乎是合理的,因为在字段的输入旁边呈现错误是很常见的。
    猜你喜欢
    • 2012-01-18
    • 2014-06-24
    • 2013-09-13
    • 2019-05-07
    • 2015-07-14
    • 2014-02-22
    • 2012-10-17
    • 2013-08-24
    • 1970-01-01
    相关资源
    最近更新 更多