在django rest_auth密码重置中,默认电子邮件内容如下所示: -
您收到此电子邮件是因为您要求在localhost:8000为您的用户帐户重置密码。
请转到以下页面并选择一个新密码:
http://localhost:8000/api/reset/Kih/89a-23809182347689312b123/
您的用户名,万一您忘记了:测试
感谢您使用我们的网站!
localhost:8000团队
如何自定义此电子邮件的内容?
答案 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