如何自定义django rest身份验证密码重置电子邮件内容/模板

如何自定义django rest身份验证密码重置电子邮件内容/模板,django,django-rest-auth,Django,Django Rest Auth,在django rest_auth password reset中,默认电子邮件内容如下所示:- 您收到此电子邮件是因为您在localhost:8000请求重置用户帐户的密码 请转到下一页并选择新密码: 您的用户名,以防您忘记:test 感谢您使用我们的网站 本地主机:8000个团队 如何自定义此电子邮件的内容?您需要使用自定义的保存方法连接您自己的重置密码序列化程序(password\u reset\u serializer) (参考号:) 不幸的是,由于电子邮件选项的使用方式,您需要覆盖整

在django rest_auth password reset中,默认电子邮件内容如下所示:-

您收到此电子邮件是因为您在localhost:8000请求重置用户帐户的密码

请转到下一页并选择新密码:

您的用户名,以防您忘记:test

感谢您使用我们的网站

本地主机:8000个团队


如何自定义此电子邮件的内容?

您需要使用自定义的
保存
方法连接您自己的重置密码序列化程序(
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

Base
PasswordResetSerializer
从此处复制:()

二,。连接自定义
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
和overided
get\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
            }
        }