我正在尝试从html表单获取文件输入,而不使用django表单,然后将该文件附加到电子邮件中。
我的HTML:
<form method="post" action="{% url 'foo' %}" enctype="multipart/form-data">
<input type="file" name="file1"/>
</form>
我的views.py:
def foo(request):
if not request.FILES['file1']:
return render(request, 'index.html', {})
email_msg = EmailMessage(subject="email subject", body="email body",
from_email="email@adress", to=["email@adress"])
email_msg.attach_file(request.FILES['file1'])
email_msg.send()
return render(request, 'needs-confirmation.html', context
我有两个问题。首先,在函数foo中,我首先检查if语句,检查用户是否已放入文件并且file1存在。当文件作为file1上载时,这可以正常工作但是,当file1没有任何文件输入时,这会出错。如何检查file1是否存在?第二个问题是当我尝试将文件附加到email_msg时,attach_file函数不起作用,给出了这个错误:
'InMemoryUploadedFile' object has no attribute 'replace'
如何从html表单获取文件并将文件附加到电子邮件中? 谢谢。
答案 0 :(得分:1)
您的代码应如下所示:
def foo(request):
#need to check that form was submitted
if request.method == "POST":
#this checks that a file exists
if len(request.FILES) != 0:
file1 = request.FILES['file1']
file1str = file1.read()
file_type = str(request.FILES['file1'].content_type)
email_msg = EmailMessage(subject="email subject", body="email body",
from_email="...", to=["..."])
#need to try to attach the file, using the attach method
try:
email_msg.attach('file1', file1str, file_type)
except Exception as e:
print(str(e))
email_msg.send()
return render(request, '/needs-confirmation.html', {})
您需要再次填写电子邮件。 你遗漏了很多关键步骤,你的HTML需要一个提交按钮和crsf_token。这适用于文本文件,您可能需要对其他文件类型进行更多处理。
希望这有帮助。