переопределение проблем с электронной почтой для сброса пароля restauth

Добрый день, я пытаюсь переопределить password_reset_email в Django allauth. проблема в том, что он успешно переопределяет, но я получаю только что отправленный пользователю html-код вместо html-представления.

Я ожидал, что письмо будет в стиле, точно так же, как я получил письмо с подтверждением, но, похоже, это не так.

In my templates/registration/password_reset_email.html

{% load i18n %}
{% autoescape off %}

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Confirm Your E-mail</title>
    <style>
        .body {
            background-color: #f6f6f6;
            padding: 30px;
            display: flex;
            flex-direction: row;
            justify-content: center; 
            align-items: center;
        }

        .content {
            background-color: #FFFFFF;
            color: #4d4d4d;
            max-width: 400px;
            padding: 20px;
            margin: auto;
        }

        .title {
            font-size: 20px;
            font-weight: 600;
            margin: 10px 0;
            text-align: center
        }

        .intro {
            font-size: 15px;
            align-self: flex-start;
            color: #4d4d4d;
            margin-bottom: 15px;
        }

        .main-body {
            font-size: 15px;
            color: #4d4d4d;
            margin-bottom: 15px;
        }

        .alt-body {
            width: 100%;
            display: flex;
            flex-direction: row !important;
            justify-content: center !important;
        }

        .alt-body>a {
            font-size: 17px;
            font-weight: 500;
            text-decoration: none;
            color: #FFFFFF;
            margin: auto;
            margin-bottom: 15px;
        }

        .cta-button {
            background-color: #525659;
            padding: 9px 100px;
            border: 2px solid #525659;
            border-radius: 35px;
            align-self: center;
        }

        .cta-button:hover {
            background-color: #000000;
            border: 2px solid #000000;
        }

        .sub-body {
            font-size: 15px;
            color: #4d4d4d;
            margin-bottom: 15px;
            margin-top: 0;
            align-self: flex-start;
        }

        .sub-body a {
            text-decoration: none;
            color: #4d4d4d;
            font-size: 15px;
        }

        .sub-body a:hover {
            text-decoration: none;
            color: #4d4d4d;
        }

        .outro {
            margin: 20px 0;
        }

        .outro > p {
            font-size: 15px;
            margin-top: 3px;
            margin-bottom: 3px;
        }

        .outro a {
            text-decoration: none;
            color: #4d4d4d;
            font-size: 15px;
            margin-top: 3px;
            margin-bottom: 3px;
        }

        .outro a:hover {
            text-decoration: none;
            color: #4d4d4d;
        }
    </style>
</head>
<body class="body">
    <div class="content">
        {% blocktrans with site_name=current_site.name site_domain=current_site.domain %}

        <p class="title">Email Verification</p>

        <p class="intro">Hello there,</p>

        <p class="main-body">
            Simply click on the button to verify your cre8ive-mart email.
        </p>

        <div class="alt-body">
            <a href="{{ activate_url }}" class="cta-button">Verify Email</a>
        </div>

        <p class="sub-body">
            if you have any questions, please contact <a href="mailto:[email protected]">[email protected]</a>
        </p>

        <div class="outro">
            <p class="outro-greeting">Sincerely,</p>
            <p class="outro-main">cre8ive-mart</p>
            <a href="#" class="outro-website">cre8ivemart.com</a>
        </div>

        {% endblocktrans %}
    </div>
</body>
</html>
{% endautoescape %}

но письмо, которое я получаю, похоже на это

но полученное письмо - это просто ответный HTML-код

это просто представление html, которое я возвращаю. вместо стилизованного компонента.


person Opeyemi Odedeyi    schedule 02.02.2020    source источник
comment
Покажите, пожалуйста, как вы отправляете электронную почту.   -  person mon io    schedule 02.02.2020
comment
это сделано Django allauth, я просто переопределил шаблон   -  person Opeyemi Odedeyi    schedule 02.02.2020


Ответы (2)


Я не вижу код, который вы использовали, но вот что у меня работает с django rest auth.

создать собственный сериализатор сброса пароля

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 User


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 User.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': 'account/email/password_reset_key.html',
            'html_email_template_name': 'account/email/password_reset_key.html',
            'request': request,
        }
        self.reset_form.save(**opts)

Затем укажите в шаблоне электронной почты для сброса пароля account/email/password_reset_key.html

Затем в настройках обновите сериализатор сброса пароля, чтобы он указывал на настраиваемый сериализатор сброса пароля.

REST_AUTH_SERIALIZERS = {
    'PASSWORD_RESET_SERIALIZER': '<path to >password_serializer.PasswordResetSerializer'
}

Это должно сработать, если нет, вам придется предоставить больше контекста о том, как вы настраиваете этот конкретный поток сброса пароля, чтобы мы могли определить, почему он отправляет его как текст вместо представления html.

person Bernard 'Beta Berlin' Parah    schedule 05.02.2020
comment
хорошо, это работает как представление html, но данные не отправляются по электронной почте. Я заметил, что данные, такие как ссылка для сброса пароля, сайт и имя домена, не были отправлены на электронную почту с формой. - person Opeyemi Odedeyi; 05.02.2020
comment
обратите внимание, что «email_template_name» должен содержать .txt, а не .html - вы не должны определять один и тот же шаблон дважды. - person Xen_mar; 10.02.2020

С более новыми версиями django-rest-auth нам нужно меньше кода для достижения того, что хочет OP:

Settings.py

REST_AUTH_SERIALIZERS = {
    'PASSWORD_RESET_SERIALIZER': 'users.serializer.PasswordResetSerializer'
}

Serializer.py

from rest_auth.serializers import PasswordResetSerializer

class PasswordResetSerializer(PasswordResetSerializer):

    def get_email_options(self):
        return {
            'subject_template_name': 'account/email/password_reset_key_subject.txt',
            'email_template_name': 'account/email/password_reset_key.txt',
            # 'html_email_template_name': 'account/password_reset_key.html',
        }
person Xen_mar    schedule 10.02.2020
comment
братан, представление html сейчас работает, но я заметил, что данные не прошли. Я заметил, что данные, такие как ссылка для сброса пароля, домен и имя сайта, не были отправлены с электронным письмом, что означает, что пользователь не может в конечном итоге сбросить свой пароль. - person Opeyemi Odedeyi; 10.02.2020
comment
Представление шаблона такое же, как и выше. но вот и ссылка на него stackoverflow.com/questions/60078367/ - person Opeyemi Odedeyi; 10.02.2020