使用 modelname.filevariable.url 上传文件的 Django 电子邮件附件
Django email attachment of an uploaded file using modelname.filevariable.url
我有一个 Django 图书馆应用程序,其中客户可以从图书列表中通过电子邮件发送特定图书的 pdf 文件 link,该文件最初是由管理员使用 FileField 上传的。
现在,电子邮件已成功 sent/received,但未附加 pdf 文件。
我也查看了其他 Stack Overflow 参考资料,但我无法解释正确的解决方案:
单击电子邮件按钮后,表单提交如下:提交表单时还提交了三个隐藏值,其中之一是 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中,我使用了Django的EmailMessage类如下:
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 文件 path/name 需要。
Update/solution
要检索 pdf 文件路径,我们必须使用 book.file.path
而不是 book.file.url
。
问题是 attach_file()
方法需要一个文件系统路径。您没有通过路径,而是通过了 URL.
您可以更改模板以将路径输出到隐藏字段中 - 例如
<input type="hidden" name="book_pdf" value="{{ book.file.path }}">
但是传递 Book
的 id
可能会更好,然后您可以从中查找您需要的所有属性。例如:
传递模板中Book
的id
:
<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>
修改视图以从 id
:
中查找 Book
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
我有一个 Django 图书馆应用程序,其中客户可以从图书列表中通过电子邮件发送特定图书的 pdf 文件 link,该文件最初是由管理员使用 FileField 上传的。 现在,电子邮件已成功 sent/received,但未附加 pdf 文件。
我也查看了其他 Stack Overflow 参考资料,但我无法解释正确的解决方案:
单击电子邮件按钮后,表单提交如下:提交表单时还提交了三个隐藏值,其中之一是 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中,我使用了Django的EmailMessage类如下:
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 文件 path/name 需要。
Update/solution
要检索 pdf 文件路径,我们必须使用 book.file.path
而不是 book.file.url
。
问题是 attach_file()
方法需要一个文件系统路径。您没有通过路径,而是通过了 URL.
您可以更改模板以将路径输出到隐藏字段中 - 例如
<input type="hidden" name="book_pdf" value="{{ book.file.path }}">
但是传递 Book
的 id
可能会更好,然后您可以从中查找您需要的所有属性。例如:
传递模板中Book
的id
:
<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>
修改视图以从 id
:
Book
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