在我看來,django只支持純文本信息,用於重置密碼的電子郵件。我如何使用HTML模板來達到這個目的?Django password_reset是否支持html電子郵件模板?
回答
這裏是你如何能做到倍率:
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()
您可以覆蓋save
方法django.contrib.auth.forms.PasswordResetForm
並將新窗體作爲參數傳遞給password_reset
視圖。
一定量之後試驗和錯誤,我發現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
爲默認值,並有沒似乎是分配其價值的一種方式,除了像我上面提到的那樣爲這種情況重寫這個特定的路線。
希望這有助於不需要複製粘貼一堆幾乎相同的代碼,如其他一些建議的建議 - 當然歡迎反饋!
對我來說,研究是耗時的,但解決方案相當微不足道。 沒有覆蓋沒有擺弄形式或任何類似的東西 我使用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'))
基於傑姆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()
您可以使用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',
}
- 1. django電子郵件模板
- 2. 電子郵件中是否支持JavaScript?
- 3. HTML電子郵件模板
- 4. 假郵件是否支持HTML郵件?
- 5. satchmo password_reset html格式郵件
- 6. 電子郵件模板在Django
- 7. 用django發送電子郵件模板
- 8. HTML電子郵件模板作爲NSString
- 9. HTML電子郵件模板居中
- 10. Razor將電子郵件模板作爲電子郵件模板
- 11. 支持移動和網頁佈局的HTML電子郵件模板框架
- 12. Django的html電子郵件
- 13. 支持所有郵件服務的HTML電子郵件生成
- 14. 電子郵件的主題行支持HTML
- 15. 電子郵件模板ColdFusion9
- 16. 電子郵件模板
- 17. Rails3 - 電子郵件模板
- 18. RazorEngine模板電子郵件
- 19. Moodle電子郵件模板
- 20. Magento電子郵件模板
- 21. Jade電子郵件模板
- 22. 電子郵件模板
- 23. Webpack電子郵件模板
- 24. 大多數電子郵件客戶端是否支持MHTML?
- 25. 電子郵件客戶端是否支持CSS Float?
- 26. 讓用戶編輯電子郵件中應用程序中的電子郵件Django模板是否安全?
- 27. Mailchimp像電子郵件模板個人電子郵件/交易電子郵件
- 28. 不支持電子郵件PHPSESSID
- 29. oauth.io和Twitter電子郵件支持?
- 30. Android Linkify電子郵件不支持
我得到這個錯誤:AttributeError的在/用戶/密碼/ reset/ 'CustomPasswordResetForm'對象沒有att ribute'users_cache'。 你犯了一個錯誤?我應該使用其他函數而不是users_cache()嗎?別人做什麼。 –