日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解Django自定義圖片和文件上傳路徑(upload_to)的2種方式

瀏覽:229日期:2024-09-15 15:31:56

最近在做一個仿知乎網站的項目了,里面涉及很多圖片和文件上傳。趁此機會我給大家總結下Django自定義圖片和文件上傳路徑的2種方式吧。

方法1: 在Django模型中定義upload_to選項。

Django模型中的ImageField和FileField的upload_to選項是必填項,其存儲路徑是相對于MEIDA_ROOT而來的。

我們來看一個簡單案例(如下所示)。如果你的MEDIA_ROOT是/media/文件夾,而你的上傳文件夾upload_to=“avatar', 那么你上傳的文件會自動存儲到/media/avatar/文件夾。

class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name=’profile’) avatar = models.ImageField(upload_to=’avatar’, verbose_name='頭像')

如果你的文件名是sky.jpg, 那么圖片上傳后數據庫中的avatar字段為avatar/sky.jpg, 該字段指向圖片對象,而非絕對路徑。要在模板中使用該圖片,應該使用avatar.url (即/media/avatar/sky.jpg)。

但在實際應用中,請千萬別這么做。這里有2個嚴重問題。

所有用戶都把頭像上傳到了同一個avatar文件夾了 原文件名是什么,那么新文件名就是什么

試想用戶很多,很可能發生文件重名問題,造成后來用戶上傳的文件把前面用戶上傳的頭像覆蓋了,造成了用戶A掛用戶B頭像的狀況。

正確的做法是動態定義上傳路徑,把圖片存儲到用戶自己的文件夾下,并對其重命名。如下圖所示。這樣圖片就會保存在/media/1/avatar/里了,而且文件以uuid命名。

from django.db import modelsfrom django.contrib.auth.models import Userimport uuid # Create your models here. def user_directory_path(instance, filename): ext = filename.split(’.’)[-1] filename = ’{}.{}’.format(uuid.uuid4().hex[:8], ext) # return the whole path to the file return '{0}/{1}/{2}'.format(instance.user.id, 'avatar', filename) class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name=’profile’) avatar = models.ImageField(upload_to=user_directory_path, verbose_name='頭像')

上述案例顯然還有一個問題,不同系統路徑分隔符/和是不一樣的,為保證代碼在不同系統中能重用,更好的方式是使用python的os模塊來拼接路徑。如下圖所示。

from django.db import modelsfrom django.contrib.auth.models import Userimport uuidimport os # Create your models here. def user_directory_path(instance, filename): ext = filename.split(’.’)[-1] filename = ’{}.{}’.format(uuid.uuid4().hex[:10], ext) # return the whole path to the file return os.path.join(instance.user.id, 'avatar', filename) class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name=’profile’) avatar = models.ImageField(upload_to=user_directory_path, verbose_name='頭像')

用戶上傳文件可能是圖片,也可能是pdf文件,我們如何把它們放在同一用戶的不同文件夾下呢?實現這個很簡單,如下圖所示。

def user_directory_path(instance, filename): ext = filename.split(’.’)[-1] filename = ’{}.{}’.format(uuid.uuid4().hex[:8], ext) sub_folder = ’file’ if ext.lower() in ['jpg', 'png', 'gif']: sub_folder = 'avatar' if ext.lower() in ['pdf', 'docx']: sub_folder = 'document' return os.path.join(instance.user.id, sub_folder, filename)

方法2: 在視圖中自定義上傳圖片或文件路徑

方法1最簡單直白,但有一個較大缺陷,文件上傳后未經處理就直接存儲了。假如用戶上傳了圖片,我們希望先對其壓縮或裁剪,然后再存儲,或者我們不希望上傳圖片或文件到默認的路徑,這時我們就有必要在視圖中自定義圖片或文件路徑了。例子如下。

@login_requireddef ajax_avatar_upload(request): user = request.user user_profile = get_object_or_404(UserProfile, user=user) if request.method == 'POST': form = AvatarUploadForm(request.POST, request.FILES) if form.is_valid(): img = request.FILES[’avatar_file’] # 獲取上傳圖片 cropped_avatar = crop_image(img, user.id) user_profile.avatar = cropped_avatar # 將圖片路徑修改到當前會員數據庫 user_profile.save() return HttpResponseRedirect(reverse(’myaccount:profile’)) def crop_image(file, uid): # 隨機生成新的圖片名,自定義路徑。 ext = file.name.split(’.’)[-1] file_name = ’{}.{}’.format(uuid.uuid4().hex[:10], ext) cropped_avatar = os.path.join(uid, 'avatar', file_name) # 相對根目錄路徑 file_path = os.path.join('media', uid, 'avatar', file_name) # 裁剪圖片,壓縮尺寸為200*200。 img = Image.open(file) crop_im = img.crop((50,50,300, 300)).resize((200, 200), Image.ANTIALIAS) crop_im.save(file_path) return cropped_avatar

到此這篇關于詳解Django自定義圖片和文件上傳路徑(upload_to)的2種方式的文章就介紹到這了,更多相關Django 上傳路徑內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Django
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲国产专区校园欧美| 日韩中文欧美在线| 日韩中文字幕在线一区| 欧美一级一区| 天堂中文av在线资源库| 一区二区电影在线观看| 国产精品久久久久久久久久10秀| 精品美女久久| 欧美国产极品| 日韩精品一区二区三区av| 麻豆亚洲精品| 久久都是精品| 国产日产一区| 成人污污视频| 亚洲免费精品| 国产精品一区二区免费福利视频 | 久久久91麻豆精品国产一区| 日产精品一区二区| 蜜桃成人av| 久久精品国产在热久久| 精品一区二区男人吃奶| 亚洲高清毛片| 欧美成人一二区| 欧美欧美黄在线二区| 精品久久久网| 国产精品原创| 日韩av二区| 99视频+国产日韩欧美| 精品国产乱码| 99久久夜色精品国产亚洲狼 | 亚洲婷婷免费| 国产精品国产三级国产在线观看| 久久精品国产网站| 美日韩精品视频| 国产精品欧美一区二区三区不卡| 欧美成人精品一级| 亚洲不卡系列| 国产欧美午夜| 性欧美长视频| 999久久久精品国产| 国产精品v亚洲精品v日韩精品| 国产精品av一区二区| 欧美片网站免费| 99视频一区| 蜜臀久久久久久久| 午夜亚洲一区| 色爱av综合网| 日本国产一区| 蜜臀久久久99精品久久久久久| 高清av一区| 日韩极品在线观看| 亚洲一区区二区| 亚洲a一区二区三区| 日韩精品a在线观看91| 国产综合精品| 欧美黄色精品| 日韩视频久久| 精品一区二区三区中文字幕视频| 日韩在线观看一区二区| 久久精选视频| 精品一区电影| 国产欧美88| 香蕉久久99| 国产精品99在线观看| 国产日韩欧美中文在线| 爽好多水快深点欧美视频| 黄色aa久久| 中文av在线全新| 国产亚洲一区| 日本va欧美va瓶| 日韩精品久久久久久久软件91| 亚洲免费观看| 噜噜噜躁狠狠躁狠狠精品视频| 国产精品婷婷| 久久国产精品免费精品3p| 国产福利片在线观看| 激情综合在线| 亚洲欧洲日本mm| 日韩av电影一区| 蜜臀国产一区| 伊人久久大香伊蕉在人线观看热v| 国产日产一区| 在线日韩视频| 天堂俺去俺来也www久久婷婷| 国产福利资源一区| 999国产精品| 日韩一区二区三区四区五区| 国产精品v一区二区三区| 成人日韩av| 日韩中文字幕麻豆| 精品久久久亚洲| 人人精品人人爱| 人人爱人人干婷婷丁香亚洲| 欧美日一区二区三区在线观看国产免| 成人一区而且| 亚洲精品国产精品粉嫩| 国产一区二区三区黄网站 | 久久狠狠久久| 日韩一区二区免费看| 奇米狠狠一区二区三区| 日韩视频二区| 91亚洲国产| 91精品美女| 99精品网站| 精品国产精品国产偷麻豆| 国产成人精品一区二区三区视频 | 亚洲va久久久噜噜噜久久| 中文字幕在线看片| 日韩欧美激情| 午夜亚洲一区| 久久婷婷激情| 欧美日韩va| 夜夜嗨一区二区| 都市激情国产精品| 国产a亚洲精品| 黄毛片在线观看| 日本免费在线视频不卡一不卡二| 一区二区精彩视频| 午夜久久免费观看| 日韩精品免费一区二区在线观看 | 精品亚洲美女网站| 国产精品黄色片| 一本综合精品| 日韩一级不卡| 日韩精品一区二区三区免费观影| 久久国产三级| 奇米亚洲欧美| 国产亚洲欧美日韩精品一区二区三区 | 性欧美videohd高精| a国产在线视频| 中文在线资源| 亚洲成人国产| 成人精品高清在线视频| 国产一区国产二区国产三区| 91在线成人| 国产一卡不卡| 国产精品22p| 免费欧美一区| 国产精品久久观看| 日韩亚洲一区在线| 麻豆精品蜜桃| 欧美亚洲国产激情| 九九久久婷婷| 先锋影音国产一区| 性欧美精品高清| 亚洲日本免费电影| 欧美一区二区三区久久精品| 91p九色成人| 亚洲精品自拍| 欧美亚洲tv| 国产精品第十页| 久久精品国产久精国产爱| 综合日韩av| 国产伊人精品| 亚洲综合小说| 国产欧美日韩免费观看| 精品欧美视频| 久久国产直播| 老司机精品久久| 日本精品国产| 成人在线免费观看网站| 久久久国产亚洲精品| 黄色精品网站| 亚洲啊v在线免费视频| 欧美亚洲免费| 激情黄产视频在线免费观看| 欧美精品一线| 日韩精品福利一区二区三区| 老鸭窝一区二区久久精品| 日本欧美不卡| 视频一区二区国产| 国产精品免费精品自在线观看| 国产不卡人人| 99综合视频| 国产日韩欧美一区二区三区在线观看| 日韩国产欧美三级| 91精品韩国| 夜夜精品视频| 国产精品一线天粉嫩av| 亚洲香蕉网站| 国产精品第一国产精品| 黄色日韩在线| 欧美+亚洲+精品+三区| 国产成人77亚洲精品www| 日韩欧美高清一区二区三区| 欧美在线观看天堂一区二区三区| 亚洲免费成人| 婷婷综合一区| 97视频热人人精品免费| 亚洲深爱激情| 蜜桃久久久久| japanese国产精品| 国产精品一区二区99| 麻豆成全视频免费观看在线看| 国产亚洲在线观看| 黄色网一区二区| 亚洲一二三区视频| 久久国产三级| 美女视频免费精品| 国产精品日韩精品中文字幕|