# ①setting,py文件加入下面设置:
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
# ②urls.py文件添加文件的访问路径
from django.conf import settings
from django.conf.urls.static import static
from django.urls import path
from .views import *
urlpatterns = [
path('', IndexView.as_view()),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# ③在models.py文件中进行限制上传文件类型
from django.db import models
class Article(models.Model):
title = models.CharField(max_length=100)
content = models.TextField()
# 使用validators.FileExtensionValidator来进行限制:
# myfile = models.FileField(upload_to="%Y/%m/%d/", validators=[validators.FileExtensionValidator(['txt', 'pdf'],
message='myfile必须为txt,pdf格式的文件')])
# 直接使用ImageField,就可以限制上传的文件,必须是图片,不用再使用验证器validators了,效果都是一样的
# 如果想要使用ImageField,必须要安装Pillow库,如果没安装运行pip install Pillow安装
myfile = models.ImageField(upload_to="%Y/%m/%d/")
# ④新建表单forms.py文件:
from django import forms # 注意是django下的forms
from one.models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = "__all__"
error_messages = {
'myfile': {
'invalid_image': '请上传正确格式的图片!'
}
}
# ⑤ views.py文件如下:
from django.http import HttpResponse
from django.shortcuts import render
from django.views.generic import View
from one.forms import ArticleForm
class IndexView(View):
# 如果是GET请求,直接渲染到上传文件页面
def get(self, request):
return render(request, 'one/index.html')
# 如果是POST请求,那么将接收文件的值
def post(self, request):
# 获取前台传来的文件,request.POST用来接收title和content,request.FILES用来接收文件
form = ArticleForm(request.POST, request.FILES)
# 将数据保存到数据库
if form.is_valid():
form.save()
return HttpResponse("SUCCESS")
else:
# 打印错误信息
print(form.errors.get_json_data())
return HttpResponse("Fail")
# ⑥表单页index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件上传页</title>
</head>
<body>
{#enctype="multipart/form-data"文件编码方式,必须设置,否则文件无法上传#}
<form action="" method="post" enctype="multipart/form-data">
<input type="text" name="title">
<input type="text" name="content">
<input type="file" name="myfile">
<input type="submit" value="提交">
</form>
</body>
</html>
Django上传图片基本原理(ImageField)
于 2018-10-25 11:17:13 首次发布