2014-04-02 2 views
1

기본 Django PasswordResetFormclean_email() 메서드를 재정의했습니다. 그 목적은 사용자가 전자 메일 (사용자의 비즈니스 로직이 어떻게 작동하는지)이 아닌 사용자 이름으로 존재하는지 확인하고자하는 것입니다. 그러면 비밀번호를 재설정 할 수 있습니다. 방법을 어떻게 재정의해야합니까? 그리고 더 많은 iportantly - 만약 내가 그것을 할 것이고, 전체 암호 재설정 시스템 깨지 않을 것입니까?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]) 

답변

0

난 당신이 당신이 원하는 것을 달성하기 위해 clean_username 방법을 쓸 수있을 것 같아요 :

은 기본 장고 코드입니다. 도움이 될 수도 있습니다 : Checking if username exists in Django

-1

나는 이것을 달성하고 싶었던 이유는 장고 등록에서 사용자 이름으로 전자 메일을 사용하고 싶었 기 때문입니다. 장고 사용자 이름 필드를 전자 메일 필드로 명명하는 것에 대해 생각했지만 Django 1.5 이후로 your own custom User model을 지정할 수 있다는 것을 알지 못했습니다.

관련 문제