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

bit*_*ter 7 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)
            )
Run Code Online (Sandbox Code Playgroud)

任何人都可以阐明在这里填充field_has_errors布尔的合理方法吗?(或者可能建议一种更好的方法来完成我正在尝试做的事情).提前致谢.

Dan*_*man 10

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

{% for field in form %}
<div class="field{% if field.errors %} field_error{% endif %}">
{{ field }}
</div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

现在在CSS中你可以做到:

div.field_error input { color: red }
Run Code Online (Sandbox Code Playgroud)

或者你需要什么.


Jas*_*lle 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)
Run Code Online (Sandbox Code Playgroud)