Вложение django в электронное письмо загруженного файла с использованием modelname.filevariable.url
У меня есть приложение библиотеки Django, в котором из списка книг клиент может отправить по электронной почте ссылку на файл PDF конкретной книги, которая была первоначально загружена администратором с использованием FileField.
Теперь электронное письмо отправляется / принимается успешно, однако PDF-файл не прикрепляется.
Я также изучил другие ссылки на stackru для того же самого, но я не могу интерпретировать правильное решение: Django электронное вложение файла для загрузки файла
При нажатии на кнопку электронной почты форма отправляется следующим образом: при отправке формы также отправляются три скрытых значения. , одним из которых является book.file.url
<form method="POST" action ="{% url 'email_book' %}" enctype="multipart/form-data">
{% csrf_token %}
# correction made
<input type="hidden" name="book_title" value="{{ book.id }}">
<button type="submit" class="btn btn-info"><span class="glyphicon glyphicon-envelope"></span> Email</button>
</form>
В views.py я использовал классы EmailMessage Django следующим образом:
def send_email(request):
# corrections made, pdf file path is being retrieved
book = Book.objects.get(pk=int(request.POST.get('id')))
book_title = book.title
book_author = book.author
book_pdf = book.file.path #inplace of book.file.url
email_body = "PDF attachment below \n Book: "+book_title+"\n Book Author: "+book_author
try:
email = EmailMessage(
'Book request',
email_body,
'sender smtp gmail' + '<dolphin2016water@gmail.com>',
['madhok.simran8@gmail.com'],
)
# this is the where the error occurs
email.attach_file(book_pdf, 'application/pdf')
email.send()
except smtplib.SMTPException:
return render(request, 'catalog/index.html')
return render(request, 'catalog/dashboard.html')
Загруженные файлы хранятся в /media/books_pdf/2018/xyz.pdf. И book.file.url содержит указанный выше путь к файлу, но PDF-файл не прикрепляется к электронному письму.
Так что я извлекаю путь к файлу динамически, используя book.file.url, и все же код правильный.
Помогите, пожалуйста, как мне узнать путь / имя файла PDF этой книги. Спасибо!
ОБНОВЛЕНИЕ: Решение найдено
Чтобы получить путь к файлу PDF, мы должны использовать book.file.path вместо book.file.url
1 ответ
Проблема в том, что attach_file()
Метод ожидает путь к файловой системе. Вы не передаете путь, вы передаете URL.
Вы можете изменить шаблон для вывода пути в скрытое поле - например,
<input type="hidden" name="book_pdf" value="{{ book.file.path }}">
Но может быть лучше пройти id
из Book
и затем вы можете найти все необходимые вам атрибуты. Например:
Пройти id
из Book
в шаблоне:
<form method="POST" action ="{% url 'email_book' %}" enctype="multipart/form-data">
{% csrf_token %}
<input type="hidden" name="book_id" value="{{ book.id }}">
<button type="submit" class="btn btn-info"><span class="glyphicon glyphicon-envelope"></span> Email</button>
</form>
Измените вид, чтобы найти Book
от id
:
def send_email(request):
book = Book.objects.get(pk=int(request.POST.get('id')))
book_title = book.title
book_author = book.author
book_pdf = book.file.path # Use the path of the book