Django - 如何在不使用django表单的情况下获取文件输入并将文件附加到电子邮件中

时间:2016-03-23 09:15:54

标签: python html django forms

我正在尝试从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表单获取文件并将文件附加到电子邮件中? 谢谢。

1 个答案:

答案 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。这适用于文本文件,您可能需要对其他文件类型进行更多处理。

希望这有帮助。