我想在没有模型的情况下上传文件(文本/图像)(仅使用视图和模板)。理想情况下,我想读或写地点。
我目前的代码如下:
在我的模板/foo/help/UploadFileContent.html
中<!doctype html>
<html>
<body>
<link rel="stylesheet" href="{{STATIC_URL}}/stylesheets/jquery-ui.css">
<div class="main-content">
<div class="container">
<div class="container">
<div class="row">
<div class="box">
<div class="box-content">
<div class="col-md-12">
<form method="post" id="fileupload" action="/helpsubmitfilecontent/" accept-charset="utf-8" class="fill-up">
{% csrf_token %}
<div class="row">
<div class="col-lg-4">
<ul class="padded separate-sections">
<li>
<input type="text" name="name" id="name" placeholder="Name"/>
</li>
<li>
<textarea name="content" id="content"
placeholder="Help Contents" style="height: 250px;width: 700px"></textarea>
</li>
<li>
<input type="file" name="myfile" id="myfile" />
</li>
</ul>
<div class="form-actions">
<button type="submit" class="btn btn-blue">Submit</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
<script>
$('#fileupload').submit(function(evnt){
if($('#name').val().length <=0){
$('#name').attr('style','border-color:red');
evnt.preventDefault();
}
if($('#content').val().length <=0){
$('#content').attr('style','border-color:red');
evnt.preventDefault();
}
});
</script>
</html>
在我的帮助视图中:
def fileupload(request):
return responsewrapper('pages/foo/help/UploadFileContent.html', locals(),request)
def submitfilecontent(request):
myhash = dict()
myhash['name'] = request.POST['name'] # works
myhash['filedata'] = request.POST['content'] # works
handle_uploaded_file(request.FILES['myfile']) # error throws up here.
return HttpResponseRedirect("/successupload")
def handle_uploaded_file(f):
destination = open('/home/foo/name.txt', 'wb+')
for chunk in f.chunks():
destination.write(chunk)
destination.close()
操作文件数据时会抛出以下错误。
Exception Value:
"Key 'myfile' not found in <MultiValueDict: {}>"
请指教。我理想情况下不喜欢使用任何数据库,因为我想要的是将文本/图像导入静态位置。
答案 0 :(得分:7)
您错过了enctype="multipart/form-data"
代码中的<form>
属性。
修改强>
handle_uploaded_file
的参数,你称之为f
,是UploadedFile的一个实例,根据docs的name
属性,你可以可能根据名称改变目的地。或者您可以查看内容本身并以此方式确定。
答案 1 :(得分:3)
上传文件时不必使用模型。你可以用这个
<form method="post" enctype="multipart/form-data">
<input type="file" name="sentFile" />
<input type="submit" name="submit" value="Upload" />
</form>
并在视图中
def myview(request):
f = request.FILES['sentFile'] # here you get the files needed
print f.name