Django上傳圖片基本原理(ImageField)
阿新 • • 發佈:2018-12-17
# ①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>