2013-09-21 2 views
7

Как указано в названии.Регистрация пользователя Django - Сброс пароля по электронной почте

Есть встроенный метод в Django 1.5, который обрабатывает сброс пароля пользователя? Т.е. через ссылку для сброса электронной почты?

Нужно, чтобы мои пользователи имели ссылку «Забыли пароль».

ответ

24

Да, есть.

Вы можете использовать эту форму тоже в вашем forms.py

class PassworResetForm(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."), 
     } 
    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]) 

Необходимо создать шаблон HTML для отправки пользователю:

{% autoescape off %} 
    You're receiving this e-mail because you requested a password reset for your user account at {{ site_name }}. 

    Please go to the following page and choose a new password: 
    {% block reset_link %} 
     {{ domain }}{% url 'django.contrib.auth.views.password_reset_confirm' uidb36=uid token=token %} 
    {% endblock %} 

    Your username, in case you've forgotten: {{ user.username }} 

    Thanks for using our site! 

    The {{ site_name }} team. 

{% endautoescape %} 

И добавить этот адрес в urls.py

(r'^accounts/password/reset/$', 'django.contrib.auth.views.password_reset', 
    {'post_reset_redirect' : '/accounts/password/reset/done/'}), 
    (r'^accounts/password/reset/done/$', 'django.contrib.auth.views.password_reset_done'), 
    (r'^accounts/password/reset/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', 'django.contrib.auth.views.password_reset_confirm', 
    {'post_reset_redirect' : '/accounts/password/done/'}), 
    (r'^accounts/password/done/$', 'django.contrib.auth.views.password_reset_complete'), 

Сделать шаблон для каждого URL

+0

спасибо !! именно то, что мне нужно. извините за принятие окончательного ответа. – endline

+3

Одно из предложений: удаление сообщений об ошибках может быть хорошей идеей. Если вы просто скажете «отправлено по электронной почте», вы не будете передавать информацию о том, кто зарегистрирован в вашей системе. –

+0

Огромное спасибо. –

0

Вы можете использовать по умолчанию URL'ы, Джанго-администратор

Добавить url('^', include('django.contrib.auth.urls')), к вашему urls.py

Добавить учетные данные электронной почты в settings.py

# using gmail as my smtp server 
EMAIL_USE_TLS = True 
EMAIL_HOST = 'smtp.gmail.com' 
EMAIL_HOST_USER = '[email protected]' 
EMAIL_HOST_PASSWORD = 'password' 
EMAIL_PORT = 587 

Затем используйте ссылку http://baseurl/password_reset/

Добавить

Смежные вопросы