2012-01-20 26 views
7

Tôi hiện đang sử dụng django.contrib.auth.views.password_password_reset_confirm để thay đổi mật khẩu của người dùng. Đây là cách các url của tôi trông:Thực hiện một độ dài tối thiểu trong mật khẩu 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'), 

Hiện nay, tôi đang làm nó trực tiếp vào thân cây 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 

Chắc chắn phải có một cách tốt hơn.

+0

Sẽ không 'nếu len (password1) <7' chấp nhận một pa ssword của chiều dài 7 (mà không phải là ít nhất 8)? – Dirk

Trả lời

2

Nếu tôi hiểu chính xác, bạn đang sửa đổi mã django? Bởi vì đó không phải là cách để làm điều đó.

Bạn sử dụng biểu mẫu nào? Có vẻ như thực tế rằng PasswordChangeForm được tích hợp sẵn sẽ không cho phép bạn đặt độ dài tối thiểu.

Có thể bạn có thể sử dụng chế độ xem password_change và đặt password_change_form của riêng bạn, có thể kế thừa từ PasswordChangeForm cơ bản mà bạn có thể áp dụng thêm cleaning.

+0

Câu trả lời hay, tôi đã thêm một câu trả lời khác với mã tôi cuối cùng đã viết http://stackoverflow.com/a/20678355/340128 – Variant

4

Tôi đang sử dụng plugin đăng ký django, mà tôi thấy là tuyệt vời, vì vậy ví dụ của tôi dựa trên đó. Nhưng bạn có thể làm một điều rất giống nhau mà không có nó.

This post thực hiện một công việc tốt để đi bộ thông qua cách ghi đè biểu mẫu (và tiện ích con) để đăng ký django - trong trường hợp này là trình chặn spam-bot recaptcha.

Những gì bạn cần làm là ghi đè lên lớp RegistrationForm (như bên dưới) và chỉ urls.py của bạn để sử dụng nó thay cho RegistrationForm mặc định

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 

(Trong một lớp học mẫu, django sẽ tìm kiếm chức năng bắt đầu bằng clean_ và kết thúc bằng một tên lĩnh vực (như password1) để thực hiện trong quá trình xác nhận theo mẫu)

các bit quan trọng khác là sử dụng các hình thức trong urls.py của bạn, như vậy:.

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

Mã mà tôi cuối cùng đã viết sau khi tìm hiểu câu trả lời chấp nhận của Arthur:

Đây là hình thức kế thừa:

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 

Trong urls.py bạn có thể hướng dẫn chế độ xem để sử dụng các hình thức tùy chỉnh bằng cách chỉ định 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}), 
Các vấn đề liên quan