筆記內容:django user前台上傳圖檔設定
- model中設定ImageField
featured_image = models.ImageField(null=True,blank=True, default="userimages/default.jpg")
- 更新與啟動,python manage.py makemigrations -> python manage.py migrate
如果有出現警告pillow需要被下載,就在terminal呼叫pip下載pillow (跟上傳檔案文檔有關的程式)
這時候的admin後台應該已經有了,但是前台還沒有,前台需要去form.py設定。
- 因為上傳檔案要跟django說你檔案要放在哪裡,所以去settings設定
MEDIA_URL='/userimages/' —>前台要去撈圖片時需要有url
MEDIA_ROOT= os.path.join(BASE_DIR , 'static/userimages') —>上傳的檔案就會存在這裡,可以自己命名資料夾
form.py的fields要加入image的model name
(設定完前台就看得到上傳檔案了)
- 但是前台還沒辦法知道如要load圖檔要去哪裡找,網址比需要對應到圖片網址,因此要在url import以下
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
—>這串不太懂意思,應該是說要幫圖檔創造url要在url+=後面網址的邏輯
- 最後前台上傳的檔案也需要被設定,在執行POST有存到指定的資料夾,才能被save
需加入request.FILES,create跟update都會需要用到(會更新到圖檔的功能),所以都要設定
def createProject(request):
form = ProjectForm()
if request.method == "POST":
form = ProjectForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('projects')
- 設定form上傳時發到伺服器
enctype="multipart/form-data"
Enctype
Enctype :指定將資料回發到伺服器時瀏覽器使用的編碼型別。用於表單裡有圖片上傳。
編碼型別有以下三種:
application/x-www-form-urlencoded: 在傳送前編碼所有字元(預設)。這是標準的編碼格式。
multipart/form-data: 不對字元編碼,在使用包含檔案上傳控制元件的表單時,必須使用該值。
text/plain: 窗體資料以純文字形式進行編碼,其中不含任何控制元件或格式字元。空格轉換為 ” ” 加號,但不對特殊字元編碼。
表單中enctype=”multipart/form-data”的意思,是設定表 單的MIME編碼。預設情況,這個編碼格式是 application/x-www-form-urlencoded,不能用於檔案上傳;只有使用了multipart/form-data,才能完整 的傳遞檔案資料。
enctype=”multipart/form-data”是上傳二進位制資料過去。
如果在伺服器端要通過Request物件來獲取相應表單域的值,則應該將enctype屬性設定為application/x-www-form-urlencoded值(即預設值,可以不顯示設定)。
參考:https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/544448/