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)
Другие вопросы по тегам