如何自定义django rest身份验证密码重置电子邮件内容/模板
在django rest_auth password reset中,默认电子邮件内容如下所示:- 您收到此电子邮件是因为您在localhost:8000请求重置用户帐户的密码 请转到下一页并选择新密码: 您的用户名,以防您忘记:test 感谢您使用我们的网站 本地主机:8000个团队如何自定义django rest身份验证密码重置电子邮件内容/模板,django,django-rest-auth,Django,Django Rest Auth,在django rest_auth password reset中,默认电子邮件内容如下所示:- 您收到此电子邮件是因为您在localhost:8000请求重置用户帐户的密码 请转到下一页并选择新密码: 您的用户名,以防您忘记:test 感谢您使用我们的网站 本地主机:8000个团队 如何自定义此电子邮件的内容?您需要使用自定义的保存方法连接您自己的重置密码序列化程序(password\u reset\u serializer) (参考号:) 不幸的是,由于电子邮件选项的使用方式,您需要覆盖整
如何自定义此电子邮件的内容?您需要使用自定义的
保存方法连接您自己的重置密码序列化程序(password\u reset\u serializer
)
(参考号:)
不幸的是,由于电子邮件选项的使用方式,您需要覆盖整个save方法。在下一版本(0.7.0)中,我们将使其更加灵活。在模板文件夹中创建路径如下的目录
模板/管理/注册/
现在将django/contrib/admin/templates/registration/中的所有文件复制到您刚刚创建的目录中。您可以找到安装django的目录。在linux中,可以在这里找到它
/usr/local/lib/python2.7/dist-packages/django/contrib/admin/templates/registration
您需要根权限才能访问此文件
现在,当您发送电子邮件时,将使用刚刚复制到项目中的模板。此链接可能会有所帮助。有了它,我能够找到电子邮件模板的位置以及如何自定义它们
您可以在页面底部的下面找到信息
自定义电子邮件消息
我最近需要在我的一个项目中实现同样的东西,但在任何地方都找不到彻底的答案
因此,我将把我的解决方案留给将来需要它的人
扩展马里奥德夫的建议:
一,。使用自定义的save
方法创建自己的PasswordResetSerializer
BasePasswordResetSerializer
从此处复制:()
二,。连接自定义PasswordResetSerializer
以覆盖默认值
yourproject_app/settings.py
REST_AUTH_SERIALIZERS = {
'PASSWORD_RESET_SERIALIZER':
'yourproject_app.serializers.PasswordResetSerializer',
}
三,。将自定义电子邮件文本文件所在目录的路径添加到模板
yourproject/settings.py
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'yourproject/templates')],
...
}
]
四,。编写自定义电子邮件(默认从Django复制)
更新:此解决方案是为较旧版本的django rest auth(v0.6.0)编写的。从评论中我可以看出,似乎对源程序包进行了一些更新,可以更方便地处理定制电子邮件模板。最好使用包中定义的方法,而不是像在我的解决方案中那样重写它们。虽然曾经是必要的,但现在可能不再如此。一个简单的解决方案是
创建模板目录:
-templates
-registration
password_reset_email.html
有你想要的内容。
Django rest auth使用Django.contrib.auth模板。如果您想使用html电子邮件模板,Brian回答的更新是添加
'html\u email\u template\u name':'account/email/example\u message.html',
就在下面
使用您的文本文件######
“email\u template\u name”:“account/email/example\u message.txt”,
通过这种方式,您可以使用html模板发送电子邮件
您可以通过检查PasswordResetForm类的send\u mail
方法来了解发生这种情况的原因
class PasswordResetForm(forms.Form):
email = forms.EmailField(label=_("Email"), max_length=254)
def send_mail(self, subject_template_name, email_template_name,
context, from_email, to_email, html_email_template_name=None):
"""
Send 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])
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
并重写get\u email\u选项
方法。例如:
from rest_auth.serializers import PasswordResetSerializer
class CustomPasswordResetSerializer(PasswordResetSerializer):
def get_email_options(self):
return {
'subject_template_name': 'registration/password_reset_subject.txt',
'email_template_name': 'registration/password_reset_message.txt',
'html_email_template_name': 'registration/'
'password_reset_message.html',
'extra_email_context': {
'pass_reset_obj': self.your_extra_reset_obj
}
}
不工作。我是否需要任何其他配置才能使其工作?您是否收到任何错误或它仍在使用以前的模板?仍在使用以前的模板。是否需要配置新复制的模板路径?我已将django/contrib/admin/templates/registration/in的内容复制到templates/admin/registration/。是吗?是的。您的url.py中忘记密码的url是什么?url(r'^rest auth/',include(rest_auth_url)),您的解决方案对我不起作用:我从您的步骤中完成了所有操作,但rest auth仍使用其默认电子邮件模板:(我已将我的电子邮件置于project/templates/email/password reset email.html
和overidedget\u email\u选项(self)下)
现在返回'html\u email\u template\u name':'templates/email/password reset email.html'
但仍然没有更改…使用了我的自定义密码序列化程序,我用pycharm调试器验证了这一点。因此设置应该是正确的,我覆盖的get\u email\u选项也会被调用。有什么想法吗?谢谢!@ElectRocnic而不是'templates/email/password reset-email.html'
尝试'password-reset-email.html'
,并确保在settings.py中指定了模板目录。此外,我最初编写此文件时,获取电子邮件选项(self)
未包含在rest\u auth包中。我的方法要求覆盖保存(self)
。谢谢,尽管使用当前版本的rest\u auth,您只需要为序列化程序编写一点代码。我可能会在将来发布我的解决方案。我仍然找不到解决此问题的当前解决方案。这确实令人惊讶,因为这一定是一个非常常见的用例。我尝试了此解决方案,它覆盖了序列化程序,但它没有显示出应有的效果ead它会将一封代码的电子邮件返回给我。我不知道为什么。这个答案有效,但遗憾的是这是“password\u reset\u email.html”是以明文模板的形式传递的。@opeyemiodeyei这就是为什么您会将html代码视为文本。您必须像Biran K提到的那样重写PasswordResetSerializer。这对我很有效。请注意self.pass_reset_obj只是出于示例目的。这是迄今为止最好、最短和最新的解决方案。您从哪里获得PasswordResetSerialize的您传递给CustomPasswordResetSerializer的r?@Efosa我刚刚在我的代码段中添加了导入,只是为了添加@Ryan113 answer,django rest auth的+0.9.5版本使用django allauth电子邮件和模板,所以不使用lookin
class PasswordResetForm(forms.Form):
email = forms.EmailField(label=_("Email"), max_length=254)
def send_mail(self, subject_template_name, email_template_name,
context, from_email, to_email, html_email_template_name=None):
"""
Send 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])
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()```
from rest_auth.serializers import PasswordResetSerializer
class CustomPasswordResetSerializer(PasswordResetSerializer):
def get_email_options(self):
return {
'subject_template_name': 'registration/password_reset_subject.txt',
'email_template_name': 'registration/password_reset_message.txt',
'html_email_template_name': 'registration/'
'password_reset_message.html',
'extra_email_context': {
'pass_reset_obj': self.your_extra_reset_obj
}
}