Вставка Django URL в пользовательский шаблон электронной почты - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь отправить электронное письмо от Django в пользовательском шаблоне, который я сделал для своего сайта.

Однако я не могу заставить URL-адрес Django работать правильно. Без шаблона я могу получить ссылку на работу. Имя пользователя работает для справки.

Кто-нибудь знает, как заставить это работать?

Вот мои views.py :

    #This code is in the view that sends the email
    from django.core.mail import EmailMessage
    from django.core.mail import EmailMultiAlternatives
    from django.template.loader import get_template
    from django.template import Context

    subject, from_email = 'subject', '<info@mysite.com>'
    plaintext = get_template('email.txt')
    htmly = get_template('email.html')
    username = user.username
    d = { 'username': username }
    text_content = plaintext.render(d)
    html_content = htmly.render(d)            
    msg = EmailMultiAlternatives(subject, text_content, from_email, [user.email])
    msg.attach_alternative(html_content, "text/html")
    msg.send()

Эта установка основана на этом ответе: Создание шаблонов электронной почты с помощью Django

Вот файл email.html:

    <h3>Hi <strong>{{ username }}</strong>,</h6>
    <p> disown kvdsvnsdov vknvisodvnsdv dsdov siod vsd. Here is a link:</p>
    <a href="http://domain{% url 'home' %}">Check Now</a>

Вот этот email.txt:

    Hi {{ username }},
    disown kvdsvnsdov vknvisodvnsdv dsdov siod vsd. Here is a link:
    http://domain{% url 'home' %}

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Не уверен насчет вашего шаблона, но если я правильно помню URL-адреса Django, вы можете использовать reverse в своем коде и передавать разрешенный URL-адрес в шаблон через контекст. Так что это будет примерно так:

from django.core.mail import EmailMessage
from django.core.mail import EmailMultiAlternatives
from django.template.loader import get_template
from django.template import Context
from django.urls import reverse

subject, from_email = 'subject', '<info@mysite.com>'
plaintext = get_template('email.txt')
htmly = get_template('email.html')
username = user.username
d = { 'username': username, 'url': reverse('home') }
text_content = plaintext.render(d)
html_content = htmly.render(d)            
msg = EmailMultiAlternatives(subject, text_content, from_email, [user.email])
msg.attach_alternative(html_content, "text/html")
msg.send()

Шаблон:

<h3>Hi <strong>{{ username }}</strong>,</h6>
<p> disown kvdsvnsdov vknvisodvnsdv dsdov siod vsd. Here is a link:</p>
<a href="http://domain{{ url }}">Check Now</a>
0 голосов
/ 13 октября 2019

Я думаю, что вам не хватает абсолютного URL-адреса в ссылке в шаблоне электронной почты.

Когда вы отправляете электронное письмо, Django заполняет URL-адрес относительным URL-адресом и, возможно, ваш почтовый клиент Gmail заполняетв URL с собственным доменом и путем к префиксу языка.

Вам необходимо добавить доменное имя вашего текущего сайта из шаблона Django.

<a> будет выглядеть следующим образом:

<a href="{{ request.scheme }}://{{ request.get_host }}{% url 'home' %}">Check Now</a>

Чтобы отобразить шаблон для электронной почты, что является одним из случаев, когда вы хотите указать значение хоста:

from django.template.loader import render_to_string

def view(request):
    ...
    email_body = render_to_string(
        'template.txt', context, request=request)

...