django文件上传地址以及media的设置

摘要:
Django提供upload_to属性如下所述:upload_如何使用to。为了避免重复名称,Django uploads_strftime()函数内置于。它的实际存储地址是/media/return address。数据库直接存储返回地址。
一、关于media的设置

django的media文件地址的设置其实是类似于static文件地址的设置。

media主要是用来存放一些用户上传的文件(头像、图片等)

分为三个部分:

一是在proj中建立一个media文件夹,文件夹名字可任意取,为方便起见,此处就取名为media。

django文件上传地址以及media的设置第1张

二是在setting中设置MEDIA_ROOT和MEDIA_URL

#用户文件存放位置
MEDIA_ROOT= os.path.join(BASE_DIR,'media')
MEDIA_URL = '/media/'

MEDIA_URL是media文件夹的url地址,也就是在前端访问时,使用  /media/ 这个url,到后端django会自动将该URL转换为MEDIA_ROOT这个实际地址,但是需要进行第三步设置之后才能够进行自动转换。

三是在proj的url中进行设置:

from django.contrib import admin
from django.urls import path, include
from django.conf.urls.static import static
from zl_prac import settings

urlpatterns = [
                  path('admin/', admin.site.urls),
              ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

也就是在urlpatterns后进行转换。

 二、关于文件上传地址upto的设置

用django开发,经常要处理用户上传的文件, 比如user模型里面如果又个人头像的字段 ImageField等等,而django在FielField字段(包括ImageField)的支持和扩展是做的很好的,首先一个问题,是上传的文件怎样才能放到我们想要放大的位置( 文件流是不会放到数据库里面的,该字段在数据库中只存储路径)。

一般情况下,用户上传的文件可以放在media/username下的细分文件夹,但是如何为不同的用户指定不同的路径呢?

django提供了upload_to属性 
     以下介绍upload_to的具体使用方法。

注意:

如果setting中已经指定了media设置,那么,upload_to中的文件地址只要是相对地址,则都是存放在media文件夹下的。如果没有设置,则存放在根目录下。

下面的方法都是默认设置了media文件夹。

如果upload_to中的指定的文件夹不存在,则会自动创建。

1.直接指定固定地址:

在model中直接指定一个固定的地址

class User(models.Model):
    avatar = ImageField(upload_to = 'avatar/')

实际存放地址为  media/avatar/filename

2. 使用strftime函数

如果指定固定文件夹,则可能会存在多人上传的不同文件重名情况,这时候需要解决文件名冲突。方法就是按照上传的时间不同来存放。

为了避免重名,django在upload_to上内置了strftime()函数。将时间插入

# models.py
class User(models.Model):
    avatar = ImageField(upload_to = 'avatar/%Y/%m/%d/')

%Y、%m、%d分别表示年、月、日

存储路径为   media/avatar/年/月/日

3.利用函数生成地址

以上两种方式都不能解决不同的用户使用不同的文件夹的情况。可以使用自定义函数来解决这个问题:

#让上传的文件路径动态地与user的名字有关
def upload_to(instance, fielname):  #返回一个路径名即可。调用时会自动传入user实例和filename两个参数。函数名也不一定需要叫upload_to,只要传入此函数即可。
    return '/'.join([MEDIA_ROOT, instance.user_name, filename])

class User(models.Model):
    avatar = ImageField(upload_to = upload_to)
    user_name = CharField(max_length = 250)

这里定义的upload_to返回的是一个绝对地址,改地址保存在数据库中,但是不利于网络的访问,需要就行如下修改:

def up_to(instance, filename):
        return '/'.join([instance.uid, str(int(time.time())) + '_' + filename])

此函数返回的是一个相对地址,django会自动将该相对地址放在 media之下。

其真实存储地址为   /media/返回地址

数据库中则直接存放的是返回的地址。

这样前端想访问时,直接使用:

 <img id="img_thumbnail" src="/media/{{ user.avatar}}" alt="头像">

注意,在前端使用的这个 /media/ ,并不是真正的meida文件夹,而是在setting中设置的MEDIA_URL。

免责声明:文章转载自《django文件上传地址以及media的设置》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇npx create-react-app命令不成功,更改成淘宝镜像Linux shell获取时间和时间间隔(ms级别)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux安装Elasticsearch-head插件

首先需要下载以下内容:   我试验的对应版本:ES:elasticsearch-6.6.1.tar.gz  Node:node-v10.15.3-linux-x64.tar  JDK:jdk-8u201-linux-x64.tar.gz   1. node-v10.15.3-linux-x64.tar 下载地址:https://nodejs.org/en/...

嵌入式 Linux下修改MAC地址

Linux下修改MAC地址 方法一: 1.关闭网卡设备ifconfig eth0 down2.修改MAC地址ifconfig eth0 hw ether MAC地址3.重启网卡ifconfig eth0 up 方法二:以上方法一修改后linux重启后MAC又恢复为原来的,为了下次启动时修改后的MAC仍有效,我们可以修改文件file:/etc/rc.d /...

python---硬件序列号

安装wmi : pip install wmi -i https://pypi.douban.com/simple 还要安装  pip install pywin32  import wmi c = wmi.WMI() zuban=c.Win32_BaseBoard()[0].SerialNumber.strip() #获取主板序列号 #BSN...

Android直播实现 Android端推流、播放

原文地址  :http://www.cnblogs.com/endv/p/7487685.html 最近想实现一个Android直播,但是对于这方面的资料都比较零碎,一开始是打算用ffmpeg来实现编码推流,在搜集资料期间,找到了几个强大的开源库,直接避免了jni的代码,集成后只用少量的java代码就可实现编码、推流和取流播放,整理了一下做了一个demo...

如何在Ubuntu 20.04 / 18.04或更老版本中安装ifconfig

Ubuntu Linux是最流行的操作系统之一,因此,如果你正在使用它,并希望使用Ifconfig命令查看系统的Ip地址,那么有办法安装它。就像在Windows中的ipconfig一样,我们有ifconfig for Linux操作系统来获取和使用命令行查看所有可用的网络适配器的Ip地址。然而,默认情况下,它不会出现在你的Ubuntu系统中,这需要手动安装...

Django登录与注销

一:Django中自带着登录,验证功能不用自己再去写登录功能。 1、从相应模块导入组件功能 from django.contrib.auth import authenticate,login 2、从request中拿到用户名密码,验证,验证通过获取到用户对象,不通过为None。 username = request.POST.get("u...