Django上传图片基本原理(ImageField)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33867131/article/details/83376718
# ①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>

猜你喜欢

转载自blog.csdn.net/qq_33867131/article/details/83376718