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 булевскую переменную здесь? (или, возможно, предложите лучший способ выполнить то, что я пытаюсь сделать).Заранее спасибо.

7
задан bitbutter 9 July 2010 в 14:38
поделиться

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 }

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

10
ответ дан 6 December 2019 в 15:18
поделиться

Виджет не имеет знаний о области, к которой он применяется. Это поле, которое хранит информацию об ошибках.Вы можете проверить наличие 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)
4
ответ дан 6 December 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: