在Django中除了使用ModelForm之外,还可以手动处理上传的文件
前言,关于在Django中处理文件上传
Django框架提供了非常便利的ModelForm,如果你的Model中包含FileFiled,通过ModelForm可以非常方便的处理文件上传的问题,但是如果是需单独处理上传的文件,本文提供了一个思路。
Django Views(视图函数)
from django.shortcuts import render, HttpResponse
def main(request):
# 用于生成主页面
# 当然也可以将下面的upload函数合并到main函数中.(对应urls.py 和form action均需要修改
# if request.method == 'POST':
# ....
# return HttpResponse('Good')
template = 'example/index.html'
return render(request, template, context={})
def upload(request):
if request.method == 'POST':
# 此处hunter对应index.html中name='hunter'
# <input type="file" class="form-control-file" name ='hunter'>
obj = request.FILES['hunter']
with open('upload/'+obj.name, 'wb+') as f:
for chunk in obj.chunks():
f.write(chunk)
f.close()
print('Done')
return HttpResponse('Good')
Template(模板)
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<!-- Bootstrap CSS -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous">
<title>Hello, world!</title>
</head>
<body>
<h1>Django 上传文件</h1>
<form action="{% url 'exmaple:upload' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-group">
<label for="exampleFormControlFile1">上传文件</label>
<input type="file" class="form-control-file" name ='hunter' id="exampleFormControlFile1">
<button type="submit" class="btn btn-primary mb-2">上传</button>
</div>
</form>
</body>
</html>
urls.py (路由)
主路由
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('',include('example.urls'))
]
子路由
from django.contrib import admin
from django.urls import path
from . import views
app_name = 'exmaple'
urlpatterns = [
path('',views.main,name='main'),
path('upload',views.upload,name='upload')
]