Django - прикрепить PDF-файл, созданный при просмотре, к сообщению
У этого вопроса есть некоторые элементы, но нет окончательного ответа.
Существует представление создания PDF с easy_pdf
from easy_pdf.views import PDFTemplateResponseMixin
class PostPDFDetailView(PDFTemplateResponseMixin,DetailView):
model = models.Post
template_name = 'post/post_pdf.html'
Затем я хочу прикрепить этот сгенерированный PDF-файл к следующему электронному письму:
@receiver(post_save, sender=Post)
def first_mail(sender, instance, **kwargs):
if kwargs['created']:
user_email = instance.client.email
subject, from_email, to = 'New account', 'contact@example.com', user_email
post_id = str(instance.id)
domain = Site.objects.get_current().domain
post_pdf = domain + '/post/' + post_id + '.pdf'
text_content = render_to_string('post/mail_post.txt')
html_content = render_to_string('post/mail_post.html')
# create the email, and attach the HTML version as well.
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.attach_file(post_pdf, 'application/pdf')
msg.send()
Я также попробовал это:
msg.attach_file(domain + '/post/' + post_id + '.pdf', 'application/pdf')
2 ответа
Я искал способ прикрепить PDF-файл, созданный easy_pdf, без сохранения временного файла. Поскольку я не мог найти решение в другом месте, я предлагаю короткое и рабочее предложение, используя easy_pdf.rendering.render_to_pdf:
from easy_pdf.rendering import render_to_pdf
...
post_pdf = render_to_pdf(
'post/post_pdf.html',
{'any_context_item_to_pass_to_the_template': context_value,},
)
...
msg.attach('file.pdf', post_pdf, 'application/pdf')
Я надеюсь, что это поможет, если вы все еще заинтересованы в способе сделать это.
Не уверен, что это поможет, но я использовал встроенный EmailMessage для прикрепления PDF-файлов, которые я создал, к отчетам по электронным письмам, которые я отправлял:
from django.core.mail import send_mail, EmailMessage
draft_email = EmailMessage(
#subject,
#body,
#from_email,
#to_email,
)
Опция 1:
# attach a file you have saved to the system... expects the path
draft_email.attach_file(report_pdf.name)
Вариант 2:
# expects the name of the file object
draft_email.attach("Report.pdf")
Затем отправляет, как у вас уже есть:
draft_email.send()
Несколько начальных мыслей: кажется, что вы пытаетесь использовать attach_file для вложения файла из системы, но его нет в системе. Я бы попробовал использовать attach
вместо attach_file
, если я правильно читаю ваш код, так как PDF находится в вашей памяти, а не в LTS в системе.