Я хотел бы создать виджеты, которые добавляют определенные классы к разметке элемента, когда связанное поле имеет ошибки.
Мне нелегко находить информацию о том, как проверить, связали ли полю ошибки с нею из кода определения виджета.
В данный момент у меня есть следующий тупиковый код виджета (заключительный виджет будет использовать более сложную разметку).
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 булевскую переменную здесь? (или, возможно, предложите лучший способ выполнить то, что я пытаюсь сделать).Заранее спасибо.
Как говорит Джейсон, виджет не имеет доступа к самому полю. Я думаю, что лучшим решением будет использование каскадного характера 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)