2012-01-20 9 views
7

Attualmente sto utilizzando django.contrib.auth.views.password_password_reset_confirm per modificare la password di un utente. Questo è come i miei URL aspetto:Imposizione di una lunghezza minima nella password Django

from django.contrib.auth import views as auth_views 

url(r'^password/reset/confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', 
    redirect_if_loggedin(auth_views.password_reset_confirm), 
    name='auth_password_reset_confirm'), 

Attualmente, lo faccio direttamente nel tronco Django -

# django.contrib.auth.views 
def clean_new_password2(self): 
    password1 = self.cleaned_data.get('new_password1') 
    password2 = self.cleaned_data.get('new_password2') 
    if password1 and password2: 
     if len(password1) < 8: 
      raise forms.ValidationError(_("Password must be at least 8 chars.")) 
     if password1 != password2: 
      raise forms.ValidationError(_("The two password fields didn't match.")) 
    return password2 

Sicuramente ci deve essere un modo migliore.

+0

Non 'se len (password1) <7' accetta un pa ssword di lunghezza 7 (che non è almeno 8)? – Dirk

risposta

2

Se ho capito bene, stai modificando il codice django? Perché questo non può essere il modo per farlo.

Quale modulo usi? Sembra infatti che lo PasswordChangeForm integrato non ti permetta di impostare un min_length.

Forse potresti usare la vista password_change e impostare la tua password_change_form, che potrebbe ereditare dal Basic PasswordChangeForm al quale potresti applicare ulteriori cleaning.

+0

Ottima risposta, ho aggiunto un'altra risposta con il codice alla fine ho scritto http://stackoverflow.com/a/20678355/340128 – Variant

4

Sto utilizzando il plug-in django-register, che ho trovato eccellente, quindi il mio esempio si basa su quello. Ma potresti fare una cosa molto simile senza di essa.

This post fa un buon lavoro nel camminare su come sovrascrivere un modulo (e un widget) per la registrazione di django - in questo caso per un blocco di spam bot di recaptcha.

Quello che dovete fare è sostituire la classe registrationform (come sotto) e punta l'urls.py per usarlo al posto del registrationform predefinita

class MinPasswdLenRegistrationForm(RegistrationForm): 
    min_password_length = 8 

    def clean_password1(self): 
     " Minimum length " 
     password1 = self.cleaned_data.get('password1', '') 
     if len(password1) < self.min_password_length: 
      raise forms.ValidationError("Password must have at least %i characters" % self.min_password_length) 
     else: 
      return password1 

(In una classe Form, Django cercherà funzioni che iniziano con clean_ e terminare con un nome di campo (come password1) per eseguire durante la validazione dei form)

l'altro po 'importante è quello di utilizzare il modulo nella urls.py, in questo modo:.

from django.conf.urls.defaults import * 
from registration.views import register 

from myapp.forms import MinPasswdLenRegistrationForm 

urlpatterns = patterns('', 
    url(r'^register/$', register, 
     {'form_class': MinPasswdLenRegistrationForm}, 
     name='registration.views.register'), 
    (r'', include('registration.urls')), 
) 

HTH

6

Il codice che alla fine ho scritto dopo aver compreso risposta accettato di Arthur:

Questa è la forma ereditaria:

class SetPasswordWithMinLengthForm(SetPasswordForm): 
    """ 
    Inherited form that lets a user change set his/her password without 
    entering the old password while validating min password length 
    """ 
    def clean_new_password1(self): 
     password1 = self.cleaned_data.get('new_password1') 
     if len(password1) < 4: 
      raise ValidationError("Password must be at least 4 chars.") 
     return password1 

Nel urls.py è possibile indicare la fine di utilizzare il modulo personalizzato specificando set_password_form:

url(r'^forgot_password/reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', 
                'django.contrib.auth.views.password_reset_confirm', 
                {'set_password_form':SetPasswordWithMinLengthForm}), 
Problemi correlati