2012-07-27 17 views
5

Volevo creare un modulo per reimpostare la password dell'utente. Dovrebbe essere il current_password e quindi lo new_password e confirm_new_password. Sono in grado di eseguire la convalida per verificare che le nuove password corrispondano. Come potrei essere in grado di convalidare lo current_password? C'è un modo per passare nell'oggetto User nel modulo?Modulo Django + per reimpostare la password

risposta

6

Django viene fornito con un costruito in PasswordChangeForm che è possibile importare e utilizzare nella vista.

from django.contrib.auth.forms import PasswordChangeForm 

Ma non è nemmeno necessario scrivere la propria vista di reimpostazione della password. C'è una coppia di viste django.contrib.with.views.password_change e django.contrib.auth.views.password_change_done, che puoi collegare direttamente alla configurazione dell'URL.

+0

Per i miei scopi questo non funzionerebbe. Dal momento che sto combinando la reimpostazione della password in un modulo che include molte altre cose. Ma questo sarebbe il modo corretto per questo caso d'uso. – KVISH

+0

@KVISH So che questo è un commento molto tardo, ma per la cronaca, è possibile visualizzare ed elaborare più di un modulo Django all'interno di un '

HTML'. Ci sono alcuni motivi per cui non è possibile utilizzare 'PasswordChangeForm' insieme a un altro modulo per le altre modifiche. – Oli

0

Trovato un ottimo esempio di questo: http://djangosnippets.org/snippets/158/

[EDIT]

ho usato il link qui sopra e ha fatto un paio di modifiche. Sono qui di seguito:

class PasswordForm(forms.Form): 
    password = forms.CharField(widget=forms.PasswordInput, required=False) 
    confirm_password = forms.CharField(widget=forms.PasswordInput, required=False) 
    current_password = forms.CharField(widget=forms.PasswordInput, required=False) 

    def __init__(self, user, *args, **kwargs): 
     self.user = user 
     super(PasswordForm, self).__init__(*args, **kwargs) 

    def clean_current_password(self): 
     # If the user entered the current password, make sure it's right 
     if self.cleaned_data['current_password'] and not self.user.check_password(self.cleaned_data['current_password']): 
      raise ValidationError('This is not your current password. Please try again.') 

     # If the user entered the current password, make sure they entered the new passwords as well 
     if self.cleaned_data['current_password'] and not (self.cleaned_data['password'] or self.cleaned_data['confirm_password']): 
      raise ValidationError('Please enter a new password and a confirmation to update.') 

     return self.cleaned_data['current_password'] 

    def clean_confirm_password(self): 
     # Make sure the new password and confirmation match 
     password1 = self.cleaned_data.get('password') 
     password2 = self.cleaned_data.get('confirm_password') 

     if password1 != password2: 
      raise forms.ValidationError("Your passwords didn't match. Please try again.") 

     return self.cleaned_data.get('confirm_password') 
Problemi correlati