2015-04-10 13 views
12

Próbuję dodać niestandardowe sprawdzanie hasła do użytkownika create i zmienić formularze administratora hasła. W dokumentach django nie widziałem niczego, jak to zrobić. Znalazłem ten post na SO: Enforcing password strength requirements with django.contrib.auth.views.password_change, który daje 2 rozwiązania. Próbowałem obu, ale żadna nie zadziałała dla mnie.niestandardowe sprawdzanie poprawności hasła w django 1.7

Oto co mam teraz w moim apps admin.py:

def validate_password_strength(value): 
    """Validates that a password is as least 10 characters long and has at least 
    2 digits and 1 Upper case letter. 
    """ 
    min_length = 10 

    if len(value) < min_length: 
     raise ValidationError(_('Password must be at least {0} characters ' 
           'long.').format(min_length)) 

    # check for 2 digits 
    if sum(c.isdigit() for c in value) < 2: 
     raise ValidationError(_('Password must container at least 2 digits.')) 

    # check for uppercase letter 
    if not any(c.isupper() for c in value): 
     raise ValidationError(_('Password must container at least 1 uppercase letter.')) 

class MySetPasswordForm(SetPasswordForm): 
    def __init__(self, *args, **kwargs): 
     super(MySetPasswordForm, self).__init__(*args, **kwargs) 
     self.fields['password1'].validators.append(validate_password_strength) 

Ale czego nie mogę dowiedzieć się, jak mogę dostać MySetPasswordForm być używany.

Próbowałem kilku różnych rzeczy. Pierwszy zrobiłem to:

class UserAdmin(UserAdmin): 
    form = MySetPasswordForm 

# Re-register UserAdmin 
admin.site.unregister(User) 
admin.site.register(User, UserAdmin) 

I mam ten błąd:

<class 'elex_apis.energy.webservice.admin.UserAdmin'>: (admin.E016) The value of 'form' must inherit from 'BaseModelForm'. 

Więc zmieniłem MySetPasswordForm dziedziczyć z BaseModelForm a potem mam ten błąd:

__init__() missing 1 required positional argument: 'user' 

Więc Dodałem parametr użytkownika, więc teraz MySetPasswordForm wyglądał tak:

class MySetPasswordForm(BaseModelForm): 
    def __init__(self, user, *args, **kwargs): 
     super(MySetPasswordForm, self).__init__(user, *args, **kwargs) 
     self.fields['password1'].validators.append(validate_password_strength) 

Ale nadal mam ten sam błąd co poprzednio.

Nie mogę uwierzyć, że trudno jest dodać weryfikator haseł. Musi to być bardzo powszechna potrzeba, więc wyraźnie brakuje mi czegoś prostego. Czy ktoś może tutaj udzielić pomocy?

Odpowiedz

7

Najprostszym sposobem jest odziedziczenie oryginalnego UserAdmin i zastąpienie change_password_form.

Przykład: „Bez hasła”

from django.contrib.auth import models as auth_models 
from django.contrib.auth import admin as auth_admin 
from django.contrib.auth import forms as auth_forms 
from django.core.exceptions import ValidationError 


def validate_password_strength(value): 
    """Validates that a password is as least 10 characters long and has at least 
    2 digits and 1 Upper case letter. 
    """ 
    min_length = 10 

    if len(value) < min_length: 
     raise ValidationError(_('Password must be at least {0} characters ' 
           'long.').format(min_length)) 

    # check for 2 digits 
    if sum(c.isdigit() for c in value) < 2: 
     raise ValidationError(_('Password must container at least 2 digits.')) 

    # check for uppercase letter 
    if not any(c.isupper() for c in value): 
     raise ValidationError(_('Password must container at least 1 uppercase letter.')) 

    return value 


class AdminPasswordChangeForm(auth_forms.AdminPasswordChangeForm): 
    def clean_password1(self): 
     return validate_password_strength(self.cleaned_data['password1']) 


class UserCreationForm(auth_forms.UserCreationForm): 
    def clean_password1(self): 
     return validate_password_strength(self.cleaned_data['password1']) 


class UserAdmin(auth_admin.UserAdmin): 
    change_password_form = AdminPasswordChangeForm 
    add_form = UserCreationForm 


# Re-register UserAdmin 
admin.site.unregister(auth_models.User) 
admin.site.register(auth_models.User, UserAdmin) 
+0

to robi potwierdzić hasło, ale kiedy po poprawnym wprowadzeniu hasła administratora i powraca do poprzedniej strony, to mówi Jednak gdy patrzę w bazie danych, jest hasło w auth_user. –

+1

@LarryMartell: oops ... zapomniałem dodać 'return value', spróbuj z nową wersją :) – Wolph

+0

Perfect! Dziękuję bardzo!! –

Powiązane problemy