1. 程式人生 > >Django上傳圖片基本原理(ImageField)

Django上傳圖片基本原理(ImageField)

# ①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>