Получение содержимого электронной почты с шаблоном с помощью контактной формы Django

Я установил полностью рабочую контактную форму, и теперь я хотел бы преобразовать вводимые пользователем данные в html-шаблон, чтобы при получении электронной почты их было легче читать.

Как мне это сделать? Где-то внизу я должен связать шаблон, или связать форму с шаблоном? Заранее спасибо

def contactPage(request):
    if request.method == 'POST':
        form = contactForm(request.POST)
        if form.is_valid():
            subject = "INQUIRY" 
            body = {
            'full_name': form.cleaned_data['full_name'], 
            'email': form.cleaned_data['email_address'], 
            'message':form.cleaned_data['message'], 
            }
            message = "\n".join(body.values())

            try:
                send_mail(subject, message, '', ['email]) 
            except BadHeaderError:
                return HttpResponse('Invalid header found.')
            return redirect ('thankyou')
      
    form = contactForm()
    return render(request, "contact.html", {'form':form})

Один из подходов заключается в использовании параметра html_message в send_mail(). html_message может ссылаться на html-шаблон, который будет использоваться для представления содержимого сообщения. Вот что у меня работает:

forms.py

from django import forms

class ContactForm(forms.Form):
    full_name = forms.CharField(max_length=100)
    message = forms.CharField(widget=forms.Textarea)
    from_email = forms.EmailField()

views.py

from django.core.mail import send_mail
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.template.loader import render_to_string
from django.urls import reverse

from app1.forms import ContactForm

def html_email_view(request):
    template = 'email_form.html'

    if request.POST:
        form = ContactForm(request.POST)

        if form.is_valid():
            message_plain = render_to_string(
                'email.txt', 
                {
                    'full_name': form.cleaned_data['full_name'],
                    'message': form.cleaned_data['message'],
                },
            )
            message_html = render_to_string(
                'email.html', 
                {
                    'full_name': form.cleaned_data['full_name'],
                    'message_lines': list(filter(bool, form.cleaned_data['message'].splitlines())),
                },
            )            
            send_mail(
                subject='INQUIRY',
                message=message_plain,
                from_email=form.cleaned_data['from_email'],
                recipient_list=['fake@email.com'],
                html_message=message_html,
            )

            return HttpResponseRedirect(reverse('app1:html_email_view'))

    else:
        form = ContactForm()

    context = {'form': form}

    return render(request, template, context)

email.html

<h1>You've received an email through site.com!</h1>
<div><b>Full name:</b> {{ full_name }}</div>
<hr>
<div><b>Message:</b></div>

{% for line in message_lines %}
<p>{% if line %}{{ line }}{% endif %}</p>
{% endfor %}

email.txt

Message from: {{ full_name }}
--------------------------------
Message:
{{ message }}
--------------------------------

Отправив сообщение через эту форму, я получаю одно письмо в свой почтовый ящик. Вот снимок экрана: enter image description here

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

Примечание: Мой ответ реализует ответ andilabs из этого сообщения.

Ссылка на документы: https://docs.djangoproject.com/en/4.1/topics/email/#send-mail

Вернуться на верх