Что ж, виджет - это то, как вы будете отображать данные / значение поля в HTML-шаблоне, это единственная функция виджетов, посмотрите следующий пример, взятый из документов:
>>> name = forms.TextInput(attrs={'required': True})
>>> name.render('name', 'A name')
'<input name="name" type="text" value="A name" required>'
>>>
>>> name = forms.TextInput(attrs={'required': False})
>>> name.render('name', 'A name')
'<input name="name" type="text" value="A name">'
Итак, виджетыне осведомлены о том, что данные действительны (есть ошибки) или нет, и должны оставаться такими.
Не рекомендуется обрабатывать ошибки / проверку данных на уровне виджетов, вы хотите, я могу гарантировать, чточто если вы измените внешний вид своего поля (виджета), ваши проверки продолжат работать.
Сказал, что ...
Как получить доступ к ошибкам поля?
Когда вы визуализируете форму, вы можете сделать это поле за полем, давайте возьмем эту форму в качестве примера:
class LoginForm(forms.Form):
username = forms.CharField(max_length=255)
password = forms.CharField(widget=forms.PasswordInput)
вы можете написать в temlate:
<form action="." method="get">
<p>{{ loginform.username.label }}: {{ loginform.username }}</p>
<p>{{ loginform.password.label }}: {{ loginform.password}}</p>
<button type="submit">submit</button>
</form>
И это будет выглядеть примерно так:следующее:
![enter image description here](https://i.stack.imgur.com/GJpqN.png)
Теперь предположим, что ваша форма не допускает пароли длиной менее 8 символов:
class LoginForm(forms.Form):
username = forms.CharField(max_length=255)
password = forms.CharField(widget=forms.PasswordInput)
def clean_password(self):
password = self.cleaned_data['password']
if len(password) < 8:
raise forms.ValidationError(
"Password must have at least 8 characters, it has only %(password_length)s",
code='invalid password',
params={'password_length': len(password)}
)
return password
Выможет получить доступ к ошибкам пароля, как это:
<form action="." method="get">
{% csrf_token %}
<p>{{ form.username.label }}: {{ form.username }}</p>
<p>{{ form.password.label }}: {{ form.password}}</p>
<ul>
{% for error in form.password.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
<button type="submit">submit</button>
</form>
И сейчасесли вы введете короткий пароль ...
![enter image description here](https://i.stack.imgur.com/PyZVG.png)
Я хочу, чтобы элемент управления выглядел иначе, если есть ошибки.
Вы можетедобавить стиль, если есть ошибки, просто используйте {% if ... %}
в коде вашего шаблона:
<p>
{{ form.password.label }}:
<span class="{% if form.password.errors %}pass_error{% endif %}">
{{ form.password }}
</span>
</p>
С помощью CSS:
<style>
.pass_error input {
border-color: red;
}
</style>
И вот результат:
![enter image description here](https://i.stack.imgur.com/KCnNj.png)
Заключение.
Проверка и обработка ошибок данных в форме или использование проверщиков , использование виджетов для отображения данных, конечновы можете настроить представление данных, так как вы можете указать собственный шаблон для вашего виджета.
Я также рекомендую django-widget-twaeks , если вы хотите добавить атрибуты к вашему виджету вкод шаблона.Это приложение позволяет вам писать код (например, из документации приложения):
{% load widget_tweaks %}
<!-- change input type (e.g. to HTML5) -->
{% render_field form.search_query type="search" %}
<!-- add/change several attributes -->
{% render_field form.text rows="20" cols="20" title="Hello, world!" %}
<!-- append to an attribute -->
{% render_field form.title class+="css_class_1 css_class_2" %}
<!-- template variables can be used as attribute values -->
{% render_field form.text placeholder=form.text.label %}