Django электронное вложение файла загрузки
Я пытаюсь прикрепить файл к письму. Файл загружается пользователем и помещается в папку мультимедиа.
Я пробовал два способа.
Первый:
def email_view(request, pk):
person = Person.objects.get(pk=pk)
email_to = person.email
email = EmailMessage(
'Subject here', 'Here is the message.', 'email@email.com', [email_to])
email.attach_file(person.upload)
email.send()
return redirect('home')
Это дает мне ошибку 'FieldFile' object has no attribute 'rfind'
Во-вторых:
def email_view(request, pk):
person = Person.objects.get(pk=pk)
email_to = person.email
attachment = str(person.upload)
attachment = 'http://my_site:8080/media/' + attachment.replace('./', '')
email = EmailMessage(
'Subject here', 'Here is the message.', 'email@email.com', [email_to])
email.attach_file(attachment)
email.send()
return redirect('home')
Это дает мне страницу не найдена. Если я скопирую URL из ошибки, хотя это приведет меня к файлу. Я предполагаю, что это происходит из-за формата строки
1 ответ
Решение
Вы получаете эту ошибку, потому что вы передаете объект FileField в метод attach_file, а не путь к файлу. Попробуйте изменить это на:
email.attach_file(person.upload.file.name)
У меня была такая же ошибка, что файл не найден. Это твик, который я использовал:
from django.conf import settings
import os
filename = os.path.join(settings.MEDIA_ROOT, person.upload.file.name)
email.attach_file(filename)
Вот гораздо более чистое решение. path уже содержит абсолютный путь к файлу, поэтому нет необходимости выполнять os.joins или другие конкатенации
email.attach_file(person.upload.file.path)