python - 用于密码重置的 Django-rest-auth HTML 电子邮件

标签 python django django-rest-framework django-rest-auth

是否可以在 django-rest-auth 中以 HTML 格式发送密码重置电子邮件? 默认情况下,禁用 HTML 电子邮件,并从 password_reset_email.html 模板发送简单文本。我已经将模板复制到项目结构模板中,并且可以轻松更改电子邮件的内容。

但是,作为documented Django 可以选择发送全功能的 HTML 电子邮件来重置密码。我不知道如何从 Django-rest-auth View 发送它们。

似乎 django-rest-auth 为 def password_reset 或类 PasswordResetView 使用自定义序列化程序,它们都有属性:email_template_name、html_email_template_name。

如果我能从我的 urls.py 中传递这个属性就太好了,就在这里

from rest_auth.views import PasswordResetView, 
url(r'^api/auth/reset/$', PasswordResetView.as_view(), name='rest_password_reset'),

否则,我可能应该重写序列化程序(或什至 View )或为此查看。

最佳答案

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

从此处复制的基本 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 HTML FILE ######
            'html_email_template_name': 'example_message.html',

            '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.html

<html>
  <body>
    ...
  </body>
</html>

关于python - 用于密码重置的 Django-rest-auth HTML 电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49278917/

相关文章:

python - 安装 pyserial Mac OS 10.10?

python - 是否可以只通过项目管道运行而不用Scrapy爬行?

mysql - 在 Django 中连接两个包含相同外键的表

python - ViewSet类变量

python - Django Rest Framework-在POST上创建外键对象

python - 如何优化 pandas 中的数据帧迭代?

python - 有没有办法在不生成缩略图的情况下使用 sorl-thumbnail url?

python - 如何将 per-env Tox deps 与 Pip 需求文件结合起来?

python - 在 CentOS 上升级 Python/Django 时遇到问题

python - 带 FK 的 DRF POST 对象