2012-01-20 10 views
7

Actualmente estoy usando django.contrib.auth.views.password_password_reset_confirm para cambiar la contraseña de un usuario. Así es como se ven mis URL:Aplicación de una longitud mínima en la contraseña de 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'), 

Actualmente, lo estoy haciendo directamente en el 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 

Seguramente debe haber una mejor manera.

+0

No lo haré 'if len (password1) <7' accept a pa ssword de longitud 7 (que no es al menos 8)? – Dirk

Respuesta

2

Si entiendo correctamente, ¿está modificando el código django? Porque esa no es la forma de hacerlo.

¿Qué forma usas? Parece que el built-in PasswordChangeForm no le permitirá establecer un min_length.

Quizás podría usar la vista password_change y establecer su propia contraseña_formación_cambio, que podría heredar del PasswordChangeForm básico al que podría aplicar cleaning adicional.

+0

Gran respuesta, he agregado otra respuesta con el código que finalmente escribí http://stackoverflow.com/a/20678355/340128 – Variant

4

Estoy usando el plugin django-registration, que me parece excelente, así que mi ejemplo se basa en eso. Pero podrías hacer algo muy similar sin eso.

This post hace un buen trabajo de caminar uno sobre cómo anular un formulario (y widget) para django-registration, en este caso para un bloqueador de spam-bot recaptcha.

Lo que hay que hacer es sustituir la clase de RegistrationForm (como abajo) y su punto urls.py para usarlo en lugar del predeterminado RegistrationForm

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 

(En una clase de formulario, Django buscará funciones que empezar con clean_ y terminan con un nombre de campo (como password1) para ejecutar durante la validación de formularios)

la otra cosa importante es utilizar el formulario en su urls.py, así:.

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

El código que finalmente escribí después de entender respuesta aceptada de Arthur:

Esta es la forma hereditaria:

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 

En el urls.py puede indicar al objeto de utilizar el formulario personalizado especificando 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}), 
Cuestiones relacionadas