Django rest_authパスワードリセットでは、デフォルトのメールコンテンツは次のようになります:-
Localhost:8000でユーザーアカウントのパスワードのリセットをリクエストしたため、このメールを受信しています。
次のページに移動して、新しいパスワードを選択してください。
http:// localhost:8000/api/reset/Kih/89a-23809182347689312b123 /
忘れた場合のユーザー名:テスト
当サイトをご利用いただきありがとうございます!
Localhost:8000チーム
このメールの内容をカスタマイズする方法は?
独自のリセットパスワードシリアライザーを接続する必要があります(PASSWORD_RESET_SERIALIZER
)カスタマイズされたsave
メソッドを使用します。
(参照: https://github.com/Tivix/Django-rest-auth/blob/v0.6.0/rest_auth/serializers.py#L12 )
残念ながら、電子メールオプションの使用方法が原因で、saveメソッド全体をオーバーライドする必要があります。次のリリース(0.7.0)でもう少し柔軟にします
最近、自分のプロジェクトの1つに同じことを実装する必要があり、どこにも完全な答えを見つけることができませんでした。
ですから、将来それを必要とする人のために、ここに私のソリューションを残しておきます。
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 %}
UPDATE:このソリューションは、古いバージョンのDjango-rest-auth(v0.6.0)用に作成されました。コメントからわかるように、カスタムの電子メールテンプレートをすぐに処理できるように、ソースパッケージにいくつかの更新が加えられたようです。私のソリューションのようにメソッドをオーバーライドするよりも、パッケージで定義されたメソッドを使用する方が常に優れています。かつては必要でしたが、もはやそうではないかもしれません。
簡単な解決策は、テンプレートディレクトリ上に作成することです。
-templates
-registration
password_reset_email.html
あなたが望むコンテンツで。 Django rest-authはDjango.contrib.authテンプレートを使用します。
テンプレートフォルダに次のようなパスでディレクトリを作成します
テンプレート/管理者/登録/
次に、Django/contrib/admin/templates/repository /内のすべてのファイルを作成したばかりのこのディレクトリにコピーします。このディレクトリは、Djangoをインストールした場所にあります。 Linuxでは、ここで見つけることができます
/usr/local/lib/python2.7/dist-packages/Django/contrib/admin/templates/registration
これにアクセスするには、root権限が必要になります。
これで、メールを送信するときに、プロジェクトにコピーしたばかりのテンプレートが使用されます。
hTMLメールテンプレートを使用する場合、ブライアンの回答を更新すると、次のようになります。
'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()```
このリンクが役立つ場合があります。それで私は電子メールテンプレートがどこにあるか、そしてそれらをカスタマイズする方法を見つけることができました。
ページ下部の電子メールメッセージのカスタマイズhttp://www.sarahhagstrom.com/2013/)に情報があります。 09/the-missing-Django-allauth-tutorial /#Customize_the_email_message