9

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

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

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

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

4

2 回答 2

11

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

或任何你需要的。

于 2010-07-09T15:55:03.157 回答
5

小部件不知道它被应用到的领域。它是维护有关错误信息的字段。您可以在表单的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)
于 2010-07-09T15:39:28.280 回答