好的,我知道我的问题有很多,但我找不到解决问题的答案。我是Django的新手,所以请记住。
我需要做一个上传文件:
这是我的upload.py(这是一个views.py)
from django.http import HttpResponse
def upload(request)
viewfile = HttpResponse()
viewfile.write('''
<html>
<body>
<form action="/upload_done/" method="POST" enctype="multipart/form-data" {% csrf_token %}>
<label for="file">Filename:</label>
<input type="file" name="up_file" >
<br />
<input type="submit" name="submit" value="Submit" >
</form>
return HttpResponse(viewfile)
现在我的upload_done.py:
from django.http import HttpResponseRedirect
from django.template import RequestContext
from django.shortcuts import render_to_response
from django.http import HttpResponse
import tempfile
import shutil
def upload_done(request):
viewfile = HttpResponse()
#####First I Tried this
Up_file = request.FILES['up_file']
""" It gives multivalue error('' 'up_file' '')
# then I change my upload.py input type file to text & try to collect information
# and change here Up_file = request.FILES['up_file'] to this
Up_file = request.POST['up_file']
现在我收到403 csrf错误 从Django doc,Iam无法理解模板(只能理解file.html应该与views.py的功能名称相同)是如何工作的。
请帮助我如何使用post方法&amp;如何上传文件。谢谢提前...
我也尝试了这样(写在/home/user/myproject/template/upload_form.html)(注意:模板dirctory正常工作)
<html>
<body>
<form action="/upload_done/" method="POST" enctype="multipart/form-data" {% csrf_token %}>
<label for="file">Filename:</label>
<input type="file" name="up_file" >
<br />
<input type="submit" name="submit" value="Submit" >
</form>
&安培;在上面的第二个Views.py(即upload_form.py)中将'up_file = request.FILES ['up_file']'替换为此
if request.method == 'POST':
return render(request, 'upload_form.html',{})
但是得到错误(必须返回HttpResponse)
答案 0 :(得分:2)
您无法直接在视图中编写HTML,并希望将其自动视为模板。虽然您可以将该字符串传递给模板渲染系统,但仍有充分的理由将模板和视图分开。
请返回并再次查看显示如何呈现模板的所有示例,并执行此操作而不是对HTML进行硬编码。本教程非常好,并向您展示了如何执行此操作,因此没有必要说“我无法理解模板的工作原理”。
此外,您不应为每个视图编写单独的Python文件。您可以在每个文件中具有多个视图功能。当您完成模板学习后,您可以去阅读有关表单的文档。
答案 1 :(得分:2)
这应该是这样的:
upload_form.html:
<form method="POST" enctype="multipart/form-data" >
{% csrf_token %}
{{ form.as_p }}
<input type="submit" name="submit" value="Submit" >
</form>
查看(基于the docs的示例):
from django import forms
class UploadFileForm(forms.Form):
up_file = forms.FileField()
def handle_uploaded_file(f):
with open('some/file/name.xls', 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
from django.http import HttpResponseRedirect
from django.shortcuts import render
def upload(request):
if request.method == "POST":
form = UploadFileForm(request.POST, request.FILES)
if form.is_valid():
handle_uploaded_file(request.FILES['up_file'])
return HttpResponseRedirect('/upload_done/')
form = UploadFileForm()
return render(request, 'upload_form.html', {'form': form})
这只是一个骨架。没有数据处理,没有错误处理,重定向后的视图没有任何内容。即使您处于最后期限压力之下,如果没有对框架的一些最小理解,您将无法操纵此示例。所以花点时间到go over the tutorial。我无法伸展这个。它不长,而且非常详细。
修改强>
我使用django表单将示例更新为完整的文件处理示例。我发现使用表单进行处理然后使用函数保存文件很奇怪,但是看到这就是文档的工作方式,我不会采取其他方式