Django электронное вложение загруженного файла с использованием modelname.filevariable.url - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть приложение библиотеки Django, в котором из списка книг клиент может отправить по электронной почте ссылку на pdf-файл конкретной книги, которая была первоначально загружена администратором с использованием FileField.Теперь электронное письмо отправляется / принимается успешно, однако файл PDF не прикрепляется.

Я также просмотрел другие ссылки на переполнение стека для того же самого, но не могу интерпретировать правильное решение: 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>&nbsp;&nbsp;Email</button>
   </form>

В views.py я использовал EmailMessage clas с 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 Ответ

0 голосов
/ 10 декабря 2018

Проблема в том, что метод 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>&nbsp;&nbsp;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
...