Как поместить изображение из ImageField в HTML-шаблон электронной почты в Django - PullRequest
0 голосов
/ 01 октября 2019

У меня есть views.py:

   def buy(request):
       if request.method=='POST':
           form=forms.Purchase(request.POST)
           if form.is_valid():
               form.save()
               user = Person.objects.filter(first_name=form.cleaned_data.get('first_name')).filter(last_name=form.cleaned_data.get('last_name')).first()
               name=form.cleaned_data.get('first_name') + form.cleaned_data.get('last_name')
               subject, from_email, to = 'Subject test1234', 'address@gmail.com', form.cleaned_data.get('email')
               html_content = render_to_string('tickets/mail_template.html', {'first_name':user.first_name, 'imagelink':user.qr_image})
               text_content = strip_tags(html_content)
               msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
               msg.attach_alternative(html_content, "text/html")
               msg.send()
               return redirect('thankyou')
        else:
           form=forms.Purchase()

return render(request, 'tickets/buy.html', {'form': form})

Внутри ImagField содержится файл изображения jpg, и я хочу, чтобы он отображался в отправляемом html-письме.

mail_template. html:

{% extends "event/base.html" %}
    {% block content %}
        <p>{{ first_name }}</p>
        <img src= {{ imagelink }}>
    {% endblock content%}

Первое_имя работает, а изображение - нет.

1 Ответ

0 голосов
/ 01 октября 2019

Потому что django будет хранить URL-адрес изображения в относительном формате. Вы должны сделать изображение src относительным URL, чтобы ваш почтовый ридер мог читать изображение src.

Чтобы решить эту проблему, вы можете создать абсолютный URL, используя HttpRequest.build_absolute_uri :

ваш views.py:

def view(request):

    imagelink = request.build_absolute_uri(user.qr_image.url)
    # ...{'first_name':user.first_name, 'imagelink': imagelink}

оставьте все как есть.


В некоторых случаях у вас нет объекта запроса, тогда вы могли быиспользуйте настройки для хранения SERVER_URL, и вы можете комбинировать SERVER_URL с user.qr_image, чтобы получить абсолютный URL.

settings.py

SERVER_URL="https://your-domain.com" # You could use django-environ to load this from environment variables also to be flexible when switching between environments

views.py

from django.conf import settings

def view(request):

    imagelink = settings.SERVER_URL + user.qr_image.url
    # ...{'first_name':user.first_name, 'imagelink': imagelink}
...