Django: Как проверить, есть ли ошибки поля в пользовательском определении виджета?

Я хотел бы создать виджеты, которые добавляют определенные классы в разметку элемента, когда связанное поле имеет ошибки.

Мне трудно найти информацию о том, как проверить, есть ли у поля ошибки, связанные с ним, из кода определения виджета.

на данный момент у меня есть следующий код виджета заглушки (окончательный виджет будет использовать более сложные разметки).

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 ответов


Как говорит Джейсон, виджет не имеет доступа к самому полю. Я думаю, что лучшее решение - использовать каскадный характер CSS.

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

теперь в вашем CSS вы можете сделать:

div.field_error input { color: red }

или что вам нужно.


виджет не имеет сведений о поле, к которому он применяется. Это поле содержит информацию об ошибках. Вы можете проверить наличие error_messages в init метод вашей формы и ввести класс ошибки в виджет соответственно:

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)