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)