私はDjango 1.11を使用しています。 ValidationErrorsを正しく引き上げる検証メソッドを持つフォームがあります。フォームが無効な状態で送信されると、form.error_messages
が期待通りに塗りつぶされます。しかし、テンプレートにエラーを表示する場合は、form.non_field_errors
とform.[field].errors
の両方が空白になります。これらを使用できるようにするために何か特別な処置を行う必要がありますか?私はちょっと混乱している。なぜなら、これはいつも私のために「ちょうどうまくいった」ためだ私はDjangoのドキュメンテーションをフォームを通して、関連するSOの質問だけでなく何も助けてくれませんでした。アドバイスありがとう。Djangoフォームエラーがテンプレートに表示されない
PS。私はDjangoに含まれるPasswordChangeFormとそれぞれのビューを使用できることを知っています。私は以下のコードから明らかではない私の理由があります。ありがとう。
forms.py
class PasswordChangeForm(forms.Form):
prefix = 'password_change'
error_messages = {
'password_mismatch': "The two password fields didn't match.",
'password_incorrect': "Your old password was entered incorrectly. Please enter it again.",
}
old_password = forms.CharField(
label="Old password",
strip=False,
)
new_password1 = forms.CharField(
label="New password",
strip=False,
help_text=password_validation.password_validators_help_text_html(),
)
new_password2 = forms.CharField(
label="New password repeated",
strip=False,
)
field_order = ['old_password', 'new_password1', 'new_password2']
def __init__(self, user, *args, **kwargs):
self.user = user
super().__init__(*args, **kwargs)
def clean_old_password(self):
"""
Validate that the old_password field is correct.
"""
old_password = self.cleaned_data["old_password"]
if not self.user.check_password(old_password):
raise forms.ValidationError(
self.error_messages['password_incorrect'],
code='password_incorrect',
)
return old_password
def clean_new_password2(self):
password1 = self.cleaned_data.get('new_password1')
password2 = self.cleaned_data.get('new_password2')
if password1 and password2:
if password1 != password2:
raise forms.ValidationError(
self.error_messages['password_mismatch'],
code='password_mismatch',
)
password_validation.validate_password(password2, self.user)
return password2
def save(self, commit=True):
password = self.cleaned_data["new_password1"]
self.user.set_password(password)
if commit:
self.user.save()
return self.user
views.py
def profile(request):
if request.method == 'POST' and 'password_change-submit' in request.POST:
password_change_form = PasswordChangeForm(request.POST)
if password_change_form.is_valid():
pass
else:
# for debugging purposes ... this prints errors to the console as expected
print(password_change_form.error_messages)
else:
password_change_form = PasswordChangeForm(request.user)
context = {'password_change_form': password_change_form}
return render(request, 'profile.html', context)
テンプレート
<form action="{% url 'profile' %}" method="POST">
{% csrf_token %}
{{ password_change_form.non_field_errors }}
{{ password_change_form.error_messages }} <-- for debugging purposes, this actually shows something
<div class="form-group">
{{ password_change_form.old_password.errors }}
<label for="{{ password_change_form.old_password.id_for_label }}">{{ password_change_form.old_password.label }}</label>
<input type="password" class="form-control" id="{{ password_change_form.old_password.id_for_label }}" name="{{
password_change_form.old_password.html_name }}" placeholder="{{ password_change_form.old_password.label }}">
</div>
<div class="form-group">
{{ password_change_form.new_password1.errors }}
<label for="{{ password_change_form.new_password1.id_for_label }}">{{ password_change_form.new_password1.label }}</label>
<input type="password" class="form-control" id="{{ password_change_form.new_password1.id_for_label }}" name="{{
password_change_form.new_password1.html_name }}" placeholder="{{ password_change_form.new_password1.label }}">
</div>
<div class="form-group">
{{ password_change_form.new_password2.errors }}
<label for="{{ password_change_form.new_password2.id_for_label }}">{{ password_change_form.new_password2.label }}</label>
<input type="password" class="form-control" id="{{ password_change_form.new_password2.id_for_label }}" name="{{
password_change_form.new_password2.html_name }}" placeholder="{{ password_change_form.new_password2.label }}">
</div>
<input type="submit" class="btn btn-primary" name="password_change-submit" value="Change password">
</form>
私はことを期待しますと{{ password_change_form.[field].errors }}
はテンプレートに何かを表示しますが、空白です。 {{ password_change_form.error_messages }}
はエラーを表示します(ビューでもそうですが)。実際にはこれをテンプレートで使用したことはありません。この方法では使用しないでください。
あなたはそうです、私はコメントを削除します。そのために残念。 – albar