Django:如何检查自定义窗口小部件定义中是否存在字段错误?

时间:2010-07-09 14:38:02

标签: django django-forms django-widget

我想创建一个小部件,当关联的字段有错误时,会向元素标记添加特定的类。

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

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

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布尔吗? (或者可能建议一种更好的方法来完成我正在尝试做的事情)。提前谢谢。

2 个答案:

答案 0 :(得分:10)

正如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 }

或任何你需要的东西。

答案 1 :(得分:4)

小部件不知道应用它的字段。它是维护有关错误信息的字段。您可以在表单的 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)