如何自定义django rest auth password reset email content / template

时间:2016-01-20 10:45:03

标签: django django-rest-auth

在django rest_auth密码重置中,默认电子邮件内容如下所示: -

  

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

     

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

     

http://localhost:8000/api/reset/Kih/89a-23809182347689312b123/

     

您的用户名,万一您忘记了:测试

     

感谢您使用我们的网站!

     

localhost:8000团队

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

7 个答案:

答案 0 :(得分:5)

我最近需要在我的一个项目中实现相同的功能,并且在任何地方都找不到完整的答案。

因此,我将我的解决方案留给将来有需要的人使用。

扩展mariodev的建议:

1。使用自定义的PasswordResetSerializer方法创建自己的save

从此处复制的基础PasswordResetSerializer:(https://github.com/Tivix/django-rest-auth/blob/v0.6.0/rest_auth/serializers.py#L102

yourproject_app/serializers.py

from django.contrib.auth.forms import PasswordResetForm
from django.conf import settings
from django.utils.translation import gettext as _
from rest_framework import serializers

###### IMPORT YOUR USER MODEL ######
from .models import ExampleUserModel

class PasswordResetSerializer(serializers.Serializer):
    email = serializers.EmailField()
    password_reset_form_class = PasswordResetForm
    def validate_email(self, value):
        self.reset_form = self.password_reset_form_class(data=self.initial_data)
        if not self.reset_form.is_valid():
            raise serializers.ValidationError(_('Error'))

        ###### FILTER YOUR USER MODEL ######
        if not ExampleUserModel.objects.filter(email=value).exists():

            raise serializers.ValidationError(_('Invalid e-mail address'))
        return value

    def save(self):
        request = self.context.get('request')
        opts = {
            'use_https': request.is_secure(),
            'from_email': getattr(settings, 'DEFAULT_FROM_EMAIL'),

            ###### USE YOUR TEXT FILE ######
            'email_template_name': 'example_message.txt',

            'request': request,
        }
        self.reset_form.save(**opts)

2。连接自定义PasswordResetSerializer以覆盖默认值

yourproject_app/settings.py

REST_AUTH_SERIALIZERS = {
    'PASSWORD_RESET_SERIALIZER': 
        'yourproject_app.serializers.PasswordResetSerializer',
}

3。将路径添加到您的自定义电子邮件文本文件所在的目录到TEMPLATES

yourproject/settings.py

TEMPLATES = [
    {
        ...
        'DIRS': [os.path.join(BASE_DIR, 'yourproject/templates')],
        ...
    }
]

4。编写自定义电子邮件(默认是从Django复制)

yourproject/templates/example_message.txt

{% load i18n %}{% autoescape off %}
{% blocktrans %}You're receiving this email because you requested a password reset 
for your user account at {{ site_name }}.{% endblocktrans %}

{% trans "Please go to the following page and choose a new password:" %}
{% block reset_link %}
{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
{% endblock %}
{% trans "Your username, in case you've forgotten:" %} {{ user.get_username }}

{% trans "Thanks for using our site!" %}

{% blocktrans %}The {{ site_name }} team{% endblocktrans %}

{% endautoescape %}

答案 1 :(得分:5)

您可以继承PasswordResetSerializer并覆盖get_email_options方法。例如:

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
            }
        }

答案 2 :(得分:3)

您需要使用自定义PASSWORD_RESET_SERIALIZER方法连接自己的重置密码序列化程序(save)。

(参考:https://github.com/Tivix/django-rest-auth/blob/v0.6.0/rest_auth/serializers.py#L123

不幸的是,由于电子邮件选项的使用方式,您需要覆盖整个保存方法。我们将在下一个版本(0.7.0)中使其更灵活

答案 3 :(得分:3)

一个简单的解决方案是 在模板上创建目录:

        <Engine>
            <!-- THIS GUY --> 
           <Realm className="org.apache.catalina.realm.MemoryRealm" />
                <Host ...>
                <!-- OR ADD IT HERE  DONT DO BOTH--> 
                    <Realm className="org.apache.catalina.realm.MemoryRealm" />
                    ...
                </Host>
            </Engine>

Hopefully some poor soul stumbles upon this and it helps. 

包含您想要的内容。 Django rest-auth使用django.contrib.auth模板。

答案 4 :(得分:1)

在模板文件夹中创建具有以下路径的目录

  

模板/管理/注册/

现在将django / contrib / admin / templates / registration /中的所有文件复制到刚刚创建的目录中。您可以在此目录中找到已安装django的目录。在linux中,可以在这里找到

  

/usr/local/lib/python2.7/dist-packages/django/contrib/admin/templates/registration

您需要root权限才能访问此内容。

现在,当您发送电子邮件时,您将使用刚刚复制到项目中的模板。

答案 5 :(得分:1)

如果您想使用html电子邮件模板,对Brian答案的更新将是添加

'html_email_template_name': 'account/email/example_message.html',

正下方

###### USE YOUR TEXT FILE ###### 'email_template_name': 'account/email/example_message.txt',

这样,您可以使用带有html模板的电子邮件

您可以通过检查PasswordResetForm类的send_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()```

答案 6 :(得分:0)

此链接可能会有所帮助。有了它,我能够找到电子邮件模板的位置以及如何自定义它们。

您可以在页面底部找到信息 自定义电子邮件 http://www.sarahhagstrom.com/2013/09/the-missing-django-allauth-tutorial/#Customize_the_email_message