2017-05-20 15 views
0

私はDjango 1.11を使用しています。 ValidationErrorsを正しく引き上げる検証メソッドを持つフォームがあります。フォームが無効な状態で送信されると、form.error_messagesが期待通りに塗りつぶされます。しかし、テンプレートにエラーを表示する場合は、form.non_field_errorsform.[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 }}はエラーを表示します(ビューでもそうですが)。実際にはこれをテンプレートで使用したことはありません。この方法では使用しないでください。

+0

あなたはそうです、私はコメントを削除します。そのために残念。 – albar

答えて

0

愚かな間違い:

views.pyの3行目で、私は間違ってデータを渡しています。これは次のようにしてください:

password_change_form = PasswordChangeForm(user=request.user, data=request.POST) 
関連する問題