2011-11-01 79 views

回答

6

這裏是你如何能做到倍率:

urls.py

url(r'^user/password/reset/$', 
    'YOUR_APP.views.password_reset', 
    {'post_reset_redirect' : '/#/login?resetemail=true'}, 
    name="password_reset"), 

views.py

from django.contrib.auth.views import password_reset as django_password_reset 
from YOUR_APP.forms import CustomPasswordResetForm 

def password_reset(*args, **kwargs): 
    """ 
     Overriding the Email Password Resert Forms Save to be able to send HTML email 
    """ 
    kwargs['password_reset_form'] = CustomPasswordResetForm 
    return django_password_reset(*args, **kwargs) 

form.py

from django.contrib.auth.forms import PasswordResetForm 
from django.contrib.auth.tokens import default_token_generator 

class CustomPasswordResetForm(PasswordResetForm): 
    """ 
     Overriding the Email Password Resert Forms Save to be able to send HTML email 
    """ 
    def save(self, domain_override=None, email_template_name='registration/password_reset_email.html', 
      use_https=False, token_generator=default_token_generator, request=None, email_subject_name='registration/password_reset_subject.txt', **kwargs): 
     from django.core.mail import EmailMultiAlternatives 
     from django.utils.html import strip_tags 
     from django.template.loader import render_to_string 
     from django.contrib.sites.models import get_current_site 
     from django.utils.http import int_to_base36 

     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.id), 
       'user': user, 
       'token': token_generator.make_token(user), 
       'protocol': use_https and 'https' or 'http', 
      } 
      render = render_to_string(email_template_name, c) 
      render_subject = render_to_string(email_subject_name, c) 

      msg = EmailMultiAlternatives(render_subject, strip_tags(render), None, [user.email]) 
      msg.attach_alternative(render, "text/html") 
      msg.send() 
+2

我得到這個錯誤:AttributeError的在/用戶/密碼/ reset/ 'CustomPasswordResetForm'對象沒有att ribute'users_cache'。 你犯了一個錯誤?我應該使用其他函數而不是users_cache()嗎?別人做什麼。 –

5

您可以覆蓋save方法django.contrib.auth.forms.PasswordResetForm並將新窗體作爲參數傳遞給password_reset視圖。

0

一定量之後試驗和錯誤,我發現d在Django(1.8)的最新版本中提供了一種更簡潔的方式來提供自定義模板密碼重置電子郵件。

在你project/urls.py,增加這些進口:

from django.contrib.auth import views as auth_views 
from django.core.urlresolvers import reverse_lazy 

而在你的URL模式之前,通常添加以下路由的Django的contrib驗證網址航線包括:

url(r'^accounts/password/reset/$', 
    auth_views.password_reset, 
    { 
    'post_reset_redirect': reverse_lazy('auth_password_reset_done'), 
    'html_email_template_name': 'registration/password_reset_html_email.html' 
    }, 
    name='auth_password_reset'), 


url('^', include('django.contrib.auth.urls')), 

,然後在您的應用templates/registration文件夾,用你想要的任何HTML模板創建password_reset_html_email.html

這似乎在源必要奠定django/contrib/auth/views.py究其原因,其中有視圖功能的原始URL路徑映射到:

147 def password_reset(request, is_admin_site=False, 
148     template_name='registration/password_reset_form.html', 
149     email_template_name='registration/password_reset_email.html', 
150     subject_template_name='registration/password_reset_subject.txt', 
151     password_reset_form=PasswordResetForm, 
152     token_generator=default_token_generator, 
153     post_reset_redirect=None, 
154     from_email=None, 
155     current_app=None, 
156     extra_context=None, 
157     html_email_template_name=None): 
158 

html_email_template_name設置爲None爲默認值,並有沒似乎是分配其價值的一種方式,除了像我上面提到的那樣爲這種情況重寫這個特定的路線。

希望這有助於不需要複製粘貼一堆幾乎相同的代碼,如其他一些建議的建議 - 當然歡迎反饋!

0

對我來說,研究是耗時的,但解決方案相當微不足道。 沒有覆蓋沒有擺弄形式或任何類似的東西 我使用Django == 1.8.6,但應該從至少django 1.7起。爲了能夠在password_reset HTML格式的電子郵件支持,所有我必須做的是從email_template_name =改變復位功能的電子郵件模板鍵名「電子郵件/ password_reset_email_html.html

HTML _email_template_name =」電子郵件/ password_reset_email_html。HTML」,

從而復位功能將如下這樣:

def reset(request): 
# Wrap the built-in password reset view and pass it the arguments 
# like the template name, email template name, subject template name 
# and the url to redirect after the password reset is initiated. 
return password_reset(request, template_name='profile/reset.html', 
    html_email_template_name='emails/password_reset_email_html.html', 
    subject_template_name='emails/reset_subject.txt', 
    post_reset_redirect=reverse('success')) 
0

基於傑姆Kozinoglu溶液我建議改變形式和過載send_mail代替保存方法以下面的方式:

class CustomPasswordResetForm(PasswordResetForm): 

    def send_mail(self, subject_template_name, email_template_name, 
        context, from_email, to_email, html_email_template_name=None): 
     """ 
      Sends a django.core.mail.EmailMultiAlternatives to `to_email`. 
     """ 
     subject = loader.render_to_string(subject_template_name, context) 
     # Email subject *must not* contain newlines 
     subject = ''.join(subject.splitlines()) 
     body = loader.render_to_string(email_template_name, context) 

     email_message = EmailMultiAlternatives(subject, body, from_email, [to_email]) 
     # New line introduce 
     email_message.attach_alternative(body, 'text/html') 

     if html_email_template_name is not None: 
      html_email = loader.render_to_string(html_email_template_name, context) 
      email_message.attach_alternative(html_email, 'text/html') 

     email_message.send() 
0

您可以使用PasswordResetSerializer http://django-rest-auth.readthedocs.io/en/latest/configuration.html

然後你就可以覆蓋所有形式的選項:

domain_override subject_template_name email_template_name use_https token_generator FROM_EMAIL 要求 html_email_template_name extra_email_context

在我來說,我只是覆蓋2個道具

class CustomPasswordResetSerializer(PasswordResetSerializer): 

    def get_email_options(self): 
     return { 
      'domain_override': 'anydomain.com', 
      'html_email_template_name': 'your_temp/password_reset_email.html', 
     }