2014-04-02 121 views
1

我的目的是覆蓋默認的Django PasswordResetFormclean_email()方法。這樣做的目的是我想檢查用戶是否以用戶名存在,而不是通過電子郵件(它只是我的應用程序業務邏輯的工作方式)而存在。然後我將能夠重置他的密碼。我應該如何覆蓋該方法?更重要的是 - 如果我願意,整個密碼重置系統不會中斷?Django覆蓋默認的Django表單

這是默認的Django代碼:

class PasswordResetForm(forms.Form): 
error_messages = { 
    'unknown': _("That email address doesn't have an associated " 
       "user account. Are you sure you've registered?"), 
    'unusable': _("The user account associated with this email " 
        "address cannot reset the password."), 
} 
email = forms.EmailField(label=_("Email"), max_length=254) 

def clean_email(self): 
    """ 
    Validates that an active user exists with the given email address. 
    """ 
    UserModel = get_user_model() 
    email = self.cleaned_data["email"] 
    self.users_cache = UserModel._default_manager.filter(email__iexact=email) 
    if not len(self.users_cache): 
     raise forms.ValidationError(self.error_messages['unknown']) 
    if not any(user.is_active for user in self.users_cache): 
     # none of the filtered users are active 
     raise forms.ValidationError(self.error_messages['unknown']) 
    if any((user.password == UNUSABLE_PASSWORD) 
      for user in self.users_cache): 
     raise forms.ValidationError(self.error_messages['unusable']) 
    return email 

def save(self, domain_override=None, 
     subject_template_name='registration/password_reset_subject.txt', 
     email_template_name='registration/password_reset_email.html', 
     use_https=False, token_generator=default_token_generator, 
     from_email=None, request=None): 
    """ 
    Generates a one-use only link for resetting password and sends to the 
    user. 
    """ 
    from django.core.mail import send_mail 
    for user in self.users_cache: 
     if not domain_override: 
      current_site = get_current_site(request) 
      site_name = current_site.name 
      domain = current_site.domain 
     else: 
      site_name = domain = domain_override 
     c = { 
      'email': user.email, 
      'domain': domain, 
      'site_name': site_name, 
      'uid': int_to_base36(user.pk), 
      'user': user, 
      'token': token_generator.make_token(user), 
      'protocol': use_https and 'https' or 'http', 
     } 
     subject = loader.render_to_string(subject_template_name, c) 
     # Email subject *must not* contain newlines 
     subject = ''.join(subject.splitlines()) 
     email = loader.render_to_string(email_template_name, c) 
     send_mail(subject, email, from_email, [user.email]) 

回答

-1

我想達到這個目的的原因是我想在Django Registration中使用電子郵件作爲用戶名。我想只是將Django用戶名字段命名爲email字段,但我並不知道自從Django 1.5以來,您可以指定your own custom User model