2017-02-18 5 views
0

Dies ist meine erste Verwendung von SetPasswordForm. Das Formular ist nicht gültig, zeigt jedoch keine Fehlermeldung an. Es fällt mir also schwer, herauszufinden, welcher Teil schief gelaufen ist.django: SetPasswordForm ist nicht ohne Fehler gültig

urls.py

url(r'^password_change/(?P<username>[-\w.]+)/$', views.password_change, name='password_change'), 
url(r'^password_change_done/$', views.password_change_done, name='password_change_done'), 

Wenn Benutzereingaben ihr neues Passwort ein und wenn die Aktion erfolgreich war, wird die Seite password_change_done umleiten.

views.py

@login_required 
def password_change(request, username): 
    if request.method == 'POST': 
     form = PasswordChangeForm(data=request.POST, user=request.user) 
     if form.is_valid():    
      oldpassword = form.cleaned_data.get('oldpassword') 
      password1 = form.cleaned_data.get('password1') 
      password2 = form.cleaned_data.get('password2') 
      if password1 == password2: 
       update_session_auth_hash(request, form.username) 
       form.save() 
       return HttpResponseRedirect('/blog/password_change_done/') 
      else: 
       return render(request, 'blog/profile.html', {'error_message': 'password mismatch'}) 
     else: 
     return render(request, 'blog/profile.html', {'error_messages': form.errors }) 
    else: 
     return redirect(reverse('blog:profile', args=[form.user.get_username()])) 


@login_required 
def password_change_done(request): 
return render(request, 'blog/password_change_done.html') 

forms.py

class PasswordChangeForm(SetPasswordForm): 
    error_messages = dict(SetPasswordForm.error_messages, **{ 
    'password_incorrect': ("Your old password was entered incorrectly. Please enter it again."), 
    }) 
    oldpassword = forms.CharField(
     label=("Old password"), 
     strip=False, 
     widget=forms.PasswordInput(attrs={'autofocus': True}), 
    ) 
    field_order = ['oldpassword', 'password1', 'password2'] 
    def __init__(self, user, data, **kwargs): 
     self.user = user 
     super(PasswordChangeForm, self).__init__(data, **kwargs) 
    def clean_oldpassword(self): 
     oldpassword = self.cleaned_data["oldpassword"] 
     if not self.user.check_password(oldpassword): 
      raise forms.ValidationError(
       self.error_messages['password_incorrect'], 
       code='password_incorrect', 
      ) 
     return oldpassword 

templates.py

{{ form.errors }} 
{{ form.non_field_errors }} 
{% if error_message %} 
    <h2><strong>{{ error_message }}</strong></h2> 
{% else %}<br> 
{% endif %} 
<form class="form-horizontal" role="form" action="{% url 'blog:password_change' user.username %}" method="post" enctype="multipart/form-data"> 
    {% csrf_token %} 
    {{ form.as_p }} 
    <button type="submit" class="button-primary">submit</button></div> 
</form> 

Ich habe {{form.errors}} und {{form.non_field_errors} } Wenn ein Fehler auftritt, kann die Fehlermeldung auf der Website angezeigt werden. Bis jetzt wurde jedoch keine Nachricht angezeigt und es scheint so, als ob nichts passiert, wenn der Benutzer auf die Senden-Schaltfläche klickt.

+0

Wie stellen Sie fest, dass das Formular nicht gültig ist? Beachten Sie auch, dass Sie den Passwort-Vergleich innerhalb der 'clean'-Methode des Formulars durchführen sollten. Auf diese Weise können Sie einen Formularfehler und nicht eine separate Variable zurückgeben. –

+0

können Sie versuchen, drucken (form.is_valid()) in Ihrer Sicht nach der Erstellung des Formulars? –

+0

@DanielRoseman Ich drucke unter Formular ist Vaild() und sonst, und nur dort, wo ich in den sonst Teil in der Konsole zeigt, und das Passwort war Thae Smae, so dass ich vermutete, dass das Formular nicht gültig ist – camila

Antwort

0

Sie haben hier einige Probleme, aber das Hauptproblem - wie ich Ihnen zuvor gesagt habe - ist, wie Sie Dinge an die Vorlage übergeben. Sie müssen dem Muster folgen, wie in der Dokumentation gezeigt, und Sie müssen konsistent über Ihre Variablennamen sein.

Erstens Ihr Passwort Scheck an die Form bewegen sich:

class PasswordChangeForm(SetPasswordForm): 
    ... 
    def clean(self): 
     password1 = self.cleaned_data.get('password1') 
     password2 = self.cleaned_data.get('password2') 
     if password1 1= password2: 
      raise forms.ValidationError('password mismatch') 

Nun fixieren Sie Ihre Ansicht:

def password_change(request, username): 
    if request.method == 'POST': 
     form = PasswordChangeForm(data=request.POST, user=request.user) 
     if form.is_valid(): 
      update_session_auth_hash(request, form.username) 
      form.save() 
      return HttpResponseRedirect('/blog/password_change_done/') 
     else: 
      return render(request, 'blog/profile.html', {'form': form }) 
    else: 
     return redirect(reverse('blog:profile', args=[username])) 

Und schließlich entfernen {{ error_messages }} aus Ihrer Vorlage.

+0

Wenn ich cleaned_data verwende, sollte es sich nicht selbst bilden ?? – camila

+0

Sie haben natürlich Recht, korrigiert. –

Verwandte Themen