web-dev-qa-db-ja.com

カスタマイズする方法Django Rest auth password reset email content / template

Django rest_authパスワードリセットでは、デフォルトのメールコンテンツは次のようになります:-

Localhost:8000でユーザーアカウントのパスワードのリセットをリクエストしたため、このメールを受信して​​います。

次のページに移動して、新しいパスワードを選択してください。

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

忘れた場合のユーザー名:テスト

当サイトをご利用いただきありがとうございます!

Localhost:8000チーム

このメールの内容をカスタマイズする方法は?

9

独自のリセットパスワードシリアライザーを接続する必要があります(PASSWORD_RESET_SERIALIZER)カスタマイズされたsaveメソッドを使用します。

(参照: https://github.com/Tivix/Django-rest-auth/blob/v0.6.0/rest_auth/serializers.py#L12

残念ながら、電子メールオプションの使用方法が原因で、saveメソッド全体をオーバーライドする必要があります。次のリリース(0.7.0)でもう少し柔軟にします

4
mariodev

最近、自分のプロジェクトの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)用に作成されました。コメントからわかるように、カスタムの電子メールテンプレートをすぐに処理できるように、ソースパッケージにいくつかの更新が加えられたようです。私のソリューションのようにメソッドをオーバーライドするよりも、パッケージで定義されたメソッドを使用する方が常に優れています。かつては必要でしたが、もはやそうではないかもしれません。

10
Brian K.

簡単な解決策は、テンプレートディレクトリ上に作成することです。

-templates
   -registration
       password_reset_email.html

あなたが望むコンテンツで。 Django rest-authはDjango.contrib.authテンプレートを使用します。

4

テンプレートフォルダに次のようなパスでディレクトリを作成します

テンプレート/管理者/登録/

次に、Django/contrib/admin/templates/repository /内のすべてのファイルを作成したばかりのこのディレクトリにコピーします。このディレクトリは、Djangoをインストールした場所にあります。 Linuxでは、ここで見つけることができます

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

これにアクセスするには、root権限が必要になります。

これで、メールを送信するときに、プロジェクトにコピーしたばかりのテンプレートが使用されます。

1
Muhammad Hassan

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

0
Ryan113