一:问题

当开启一个项目的时候,通常会遇到文件(图片,音频等)上传的需要,最常见的比如图片的上传,用户头像,后台管理添加图片,而图片的在是数据库中的存储主要是以该文件的相对路径,在django中可以使用media_url很好的管理上传文件。

二:操作

1、配置MEDIA_URL

Settings.py中配置上传信息

MEDIA_URL = '/media/'
# 设置上传文件的路径
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # 指定根目录

2、数据库模型配置

在数据库相关模型models中写上image字段其中的一些属性可以帮助更好的标记文件,更好的跟踪文件上传。

比如:%Y代表年,%m代表月,blank=True代表可以为空。当上传文件时,代表上传到image目录下,以当前年月子目录的文件夹中。

class GoodsInfo(models.Model):
# 商品模型:gpic为该商品的图片在项目中存储的相对路径
gpic = models.ImageField(verbose_name="图片路径", default="image/default.png", upload_to='df_goods/image/%Y/%m', null=True, blank=True) # 商品图片

在修改数据库之后需要进行迁移

python manage.py makemigrations
python manage.py migrate

3、路由的配置

使用MEDIA_URL就需要重新添加一个新的路由来管理整个文件目录,处理文件上传

在路由系统url.py中添加相关的处理函数和路由

from django.views.static import serve  # 上传文件处理函数

from .settings import MEDIA_ROOT  # 从配置中导入MEDIA_ROOT

urlpatterns = [
url(r'^media/(?P<path>.*)$', serve, {"document_root":MEDIA_ROOT})
]

4、模板的配置

因为之前在settings.py中直接进行了MEDIA_URL的相关配置,所以想在模板中使用{{MEDIA_URL}},就需要在setting.py中进行模板相关的配置,在“模板”的“context_processors”选项中添加django.template.context_processors.media。

TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages', # 下面为添加
'django.template.context_processors.media', # 将media_url上传文件路径注册到模板中
],
},
},
]

通过以上步骤,基本上可以在前端正常渲染出结果了,但还需要给图片添加一个URL以正常显示。

<img src="{{ MEDIA_URL }}{{ goods.gpic }}">
其中{{ goods.gpic }}为商品的路径

而经渲染之后,在浏览器中就正常显示为

<img src="/media/df_goods/image/2019/05/goods_detail.jpg">

也就是说MEDIA_ROOT在模板中显示其实就是/media/

三:效果

1、上传文件目录

当第一次从上传文件的时候会在项目路径下生成一个media目录,而之后每一次上传,都会根据日期来生成新的子目录或者直接添加到已存在的目录

2、数据库

在数据库中存储的是每一个文件的相对路径,只跟字段的up_load属性有关。



另外一旦文件目录混乱,或者数据库受损,就会造成文件不显示的问题,所以添加一个默认的字段属性default设置默认值是很有必要的。

django-文件上传Media url的配置的更多相关文章

  1. Django文件上传下载与富文本编辑框

    django文件上传下载 上传 配置settings.py # 设定文件的访问路径,如:访问http://127.0.0.1:8000/media/就可以获取文件 MEDIA_URL = '/medi ...

  2. django文件上传、图片验证码、抽屉数据库设计

    1.Django文件上传之Form方式 settings.py, ALLOWED_HOSTS = ['*'] INSTALLED_APPS = [ 'django.contrib.admin', 'd ...

  3. python_way day21 Django文件上传Form方式提交,原生Ajax提交字符处啊,Django文件上传之原生Ajax方式、jQuery Ajax方式、iframe方式,Django验证码,抽屉示例,

    python_way day21 1.Django文件上传至Form方式 2.原生Ajax文件上传提交表单 使用原生Ajax好处:不依赖jquery,在发送一个很小的文件或者字符串的时候就可以用原生A ...

  4. struts 多文件上传 annotation注解(零配置)+ ajaxfileupload + 异步 版本

    [本文简介] struts 多文件上传.基于”零配置“+"ajaxfileupload" 的一个简单例子. [导入依赖jar包] jquery-1.7.2.js : http:// ...

  5. django——文件上传_分页_ajax_富文本_celery

    上传文件 概述 当Django在处理文件上传时,文件的数据被存储在request.FILES属性中 FILES只有在请求的方法为POST且提交的form表单带有enctype="multip ...

  6. django 文件上传(阿里云oss)下载(支持大文件下载)

    1.文件上传 Models 设计 class Upload_File(models.Model): image = models.FileField(upload_to='file/%Y/%m',de ...

  7. django文件上传和序列化

    django实现文件上传 使用form表单上传文件 html页面 <html lang="en"> <head> <meta charset=&quo ...

  8. Python Web框架篇:Django文件上传

    上传方式: - Form表单上传文件 - Ajax上传文件 - 基于form表单和iframe自己实现ajax请求 1,创建项目 2,settings配置(注册app01,static路径等等这些)及 ...

  9. Django - 文件上传、Django组件 - 分页器(paginator)

    一.文件上传准备知识 - Content-Type 1.请求头 - Content-Type Content-Type指的是请求体的编码类型,常见的类型共有3种: 1)application/x-ww ...

随机推荐

  1. MySQL死锁1

    MySQL行级排他锁的使用及死锁解除技巧 这篇笔记存粹是做学习记录之用,方便将来查阅,老鸟请跳过.关于MySQL排他锁的具体使用. 使用排他锁 假设有一张user表如下: id name age 1 ...

  2. Centos610无桌面安装VSFTP

    1.检查可以安装的VSFTP版本 yum search vsftp 2.开始安装VSFTP yum install -y vsftpd 3.配置说明 cd /etc/vsftpd vsftpd.con ...

  3. (二)tensorflow-gpu2.0之自动导数

    import tensorflow as tf ''' 梯度:导数或偏导数 1.在什么点的导数:在点(a,b,c,w)=(1,2,3,4)点的导数 2.梯度环境 对谁求导: 对w求导 函数: y = ...

  4. 最长公共子序列-Hdu1159

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  5. Python学习第二十三课——Mysql 表记录的一些基本操作 (查)

    查(select * from 表名) 基本语法: select <字段1,字段2,...> from <表名> where <表达式>; 例如,查询student ...

  6. Python与线性代数——Numpy中的matrix()和array()的区别

    Numpy中matrix必须是2维的,但是 numpy中array可以是多维的(1D,2D,3D····ND).matrix是array的一个小的分支,包含于array.所以matrix 拥有arra ...

  7. 【JS 移动端】获取设置页面大小

    获取设置页面大小 function getMobileData() { var ismobile = false; browser = { versions: function () { var u ...

  8. OpenThreads库学习

    在看STM32资料中看到STM32WB系列“双核无线微控制器配备双核无线微控制器(MCU)配备Bluetooth® 5.OpenThread和ZigBee®3.0连接技术,同时兼备超低功耗性能“不知道 ...

  9. HDU 1035 Robot Motion(dfs + 模拟)

    嗯... 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1035 这道题比较简单,但自己一直被卡,原因就是在读入mp这张字符图的时候用了scanf被卡. ...

  10. ubuntu13.10设置永久静态IP重启不失效

    步骤: 1.vi打开/etc/network/interfaces 2.手动添加static ip address 3.:wq保存退出 4.重启网络 service network-manager r ...