我最近需要在我的一个项目中实施同样的事情,但在任何地方都找不到彻底的答案。
所以我将我的解决方案留给将来需要它的任何人。
扩展 mariodev 的建议:
1。继承 PasswordResetSerializer 并覆盖 save 方法。
yourproject_app/serializers.py
from django.conf import settings
from rest_auth.serializers import PasswordResetSerializer as _PasswordResetSerializer
class PasswordResetSerializer(_PasswordResetSerializer):
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。配置AUTH_USER_MODEL
yourproject/settings.py
###### USE YOUR USER MODEL ######
AUTH_USER_MODEL = 'yourproject_app.ExampleUser'
3。连接自定义PasswordResetSerializer 覆盖默认值
yourproject/settings.py
REST_AUTH_SERIALIZERS = {
'PASSWORD_RESET_SERIALIZER':
'yourproject_app.serializers.PasswordResetSerializer',
}
4。将自定义电子邮件文本文件所在目录的路径添加到TEMPLATES
yourproject/settings.py
TEMPLATES = [
{
...
'DIRS': [os.path.join(BASE_DIR, 'yourproject/templates')],
...
}
]
5。编写自定义电子邮件消息(默认从 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 %}
更新:此解决方案是为旧版本的 django-rest-auth (v0.6.0) 编写的。正如我从 cmets 中得知的那样,似乎对源包进行了一些更新,可以更轻松地处理开箱即用的自定义电子邮件模板。使用包中定义的方法总是比在我的解决方案中覆盖它们更好。虽然曾经是必需品,但可能不再如此。