iT邦幫忙

2023 iThome 鐵人賽

DAY 1
0
自我挑戰組

Django系列 第 9

Day9~Django 漫漫長路- 我把檔案都上傳到那裡了

  • 分享至 

  • xImage
  •  

大家好,我是Leo
今天我來介紹如何使用django檔案上傳,如果時間允許在加講解如何使用django多檔案上傳/images/emoticon/emoticon30.gif
OK~~~ Let's go now!!!


setting的檔案路徑設定

  • STATIC_URL: 來讓瀏覽器可以直接訪問靜態文件,也就是說可以定位到各個app下的staic
  • STATICFILES_DIRS : 其它存放静態文件的資料夾,可以用來存放項目中公用的静態文件,里面不能包含 STATIC_ROOT
  • MEDIA_ROOT : 主要是用來放置上傳的文件
  • MEDIA_URL : 網址的映射,才能正常顯示上傳的內容
STATIC_URL = "/static/"
# STATIC_ROOT = BASE_DIR / 'static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "static"),
]

MEDIA_ROOT = os.path.join(BASE_DIR, "media/")
MEDIA_URL = "/media/"

model的建立

首先如果我們要在users旁邊再擴展一個model,希望存放有關user的人臉照片
那可能一個user下有多張人臉照片存放在table內,這時候就要用到多對一的關聯
而table內,希望存放的資訊有filename,filepath,create time,delete time
關聯圖示如下:

https://ithelp.ithome.com.tw/upload/images/20221225/20154853nVm9H4lTHE.jpg

在models底下新創建user_photo_model.py
預期將upload file路徑自動以 《users id作為檔案分類的依據》
再將原來的file_name 透過uuid加密,加密成唯一的檔案名稱
於是在model 底下在寫入一個function
ext 為 副檔名,最後再透過拚建將轉好的加密檔名+副檔名類型

models/users_photo_model.py

from django.db import models
from website.models.users_model import Users
import uuid
import os

def get_file_path(instance, filename):
    ext = filename.split('.')[-1]
    filename = "%s.%s" % (uuid.uuid4(), ext)
    return os.path.join(f'users/{instance.user.id}', filename)

class User_Photo(models.Model):
    id =  models.AutoField(primary_key=True)
    user = models.ForeignKey(Users, on_delete=models.PROTECT, to_field='id', related_name='users',default=None,blank=True,null=True)
    file_name = models.CharField(max_length=255,null=True)
    file_path = models.FileField(upload_to=get_file_path,null=True, blank=True, default=None)
    created_at = models.DateTimeField(auto_now_add = True,editable=False)
    deleted_at = models.DateTimeField(null=True)

models/init.py

from .user_photo_model import *

建立好請執行以下語法

python manage.py makemigrations 
python manage.py migrate

Serializers的建立

serializers/user_photo_ser.py

from rest_framework import serializers
from website.models import User_Photo

class UserPhotoSerializer(serializers.ModelSerializer):
    class Meta:
        model = User_Photo
        fields = ('id','file_name', 'file_path','user')

serializers/init.py

from .user_photo_ser import *

Views的建立

views/user_photo.py

from rest_framework import generics
from rest_framework.response import Response
from website.serializers import UserPhotoSerializer
from website.models import User_Photo

class UserPhotoCreateAPIViews(generics.CreateAPIView):
    queryset = User_Photo.objects.all()
    serializer_class = UserPhotoSerializer

    def create(self, request, *args):
        response = super().create(request, *args)

        return Response(
            {
                "success": True,
                "data": response.data,
            }
        )

views/init.py

from .user_photo import *

url 建立

from django.conf import settings
from django.conf.urls.static import static
from website.views import UserPhotoCreateAPIViews

urlpatterns = [
path('api/user/photo/create', UserPhotoCreateAPIViews.as_view(), name='api-user-photo-create')
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

#MEDIA_URL : '/ media /' : media 是用來存放靜態文件的文件夾
#MEDIA_ROOT : 這是設置靜態文件的公共路徑 

postman測試檔案上傳

firstStep : 選擇Body -> form-data
secondStep : 打上參數如下圖

  • 這裡請注意,請將滑鼠移至 file_path 的框格選擇 file 類型,並上傳檔案

https://ithelp.ithome.com.tw/upload/images/20221225/20154853H9lfgSg1md.jpg

thirdStep : Post送出

如果看到跟我一樣的畫面
恭喜您檔案上傳成功,我們這時候來檢查db內與資料夾內是否有相關的資訊
如下圖,我們可以看到直接以users的id作為資料夾分別的類型依據

db

https://ithelp.ithome.com.tw/upload/images/20221225/20154853ykRG4lisdG.jpg

我們可以看到如下圖,在media下自動生成users的檔案
在users下又以id為區別分別建立資料夾

media

https://ithelp.ithome.com.tw/upload/images/20221225/20154853gsH6yZXQ8A.jpg


今天主要是介紹file upload的功能,明天預計會做從如果一次要上傳多個檔案的功能介紹
我們明天見,各位掰掰~~~/images/emoticon/emoticon29.gif


上一篇
Day8~Django 漫漫長路- migrations掌握回朔的技巧
下一篇
Day10~Django 漫漫長路- 多檔案上傳
系列文
Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言