Почему Django's AuthenticationForm возвращает странную строку в сообщении об ошибке
Недавно я внедрил Django AuthenticationForm в свой проект и обнаружил, что ошибка возвращает какой-то странный str __all__
Сообщение об ошибке во фронтенде при использовании неправильного пароля:
Мой шаблон
<div class="error-wrapper">
<div class="errors">{{ form.errors }}</div>
</div>
Поэтому я заглянул в исходный код Django, чтобы проверить форму, которая не включает __all__
в строку сообщения об ошибке:
class AuthenticationForm(forms.Form):
"""
Base class for authenticating users. Extend this to get a form that accepts
username/password logins.
"""
username = UsernameField(widget=forms.TextInput(attrs={'autofocus': True}))
password = forms.CharField(
label=_("Password"),
strip=False,
widget=forms.PasswordInput(attrs={'autocomplete': 'current-password'}),
)
error_messages = {
'invalid_login': _(
"Please enter a correct %(username)s and password. Note that both "
"fields may be case-sensitive."
),
'inactive': _("This account is inactive."),
}
Чего мне не хватает?
Свойство .errors
[Django-doc] возвращает словарь ошибок, где ключи представляют поле, в котором произошла ошибка, а значение - список ошибок. Для ошибок, которые относятся не к одному полю, а к двум или более полям, используется __all__
. Таким образом, это не полевые ошибки.
Когда вы рендерите Django from в шаблоне, вы можете использовать {{ form.non_field_errors }}
для рендеринга этих ошибок, и {{ form.some_field.errors }}
для рендеринга ошибок, относящихся к определенному полю. Вы также можете выполнять итерации form.non_field_errors
и form.some_field.errors
для получения ошибок по одной, и отображать их по-другому.
Таким образом, вы можете отобразить ошибки, не связанные с полем, с помощью:
<div class="error-wrapper">
<div class="errors">{{ form.non_field_errors }}</div>
</div>