一:问题

当开启一个项目的时候,通常会遇到文件(图片,音频等)上传的需要,最常见的比如图片的上传,用户头像,后台管理添加图片,而图片的在是数据库中的存储主要是以该文件的相对路径,在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. zabbix4.4安装和简要设置

    简介 Zabbix 是一个基于 WEB 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案.它能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决 ...

  2. javascript的阻止默认事件和阻止冒泡事件

    这两个方面的知识,在妙味课堂中有听过,再次复习一下: 原文来自:[http://www.cnblogs.com/Essence/p/4266618.html] 事件冒泡与默认行为   在说事件冒泡之前 ...

  3. 匹配 $gdinfo 中的数字

    <?php /* //下载 $filename = 'av.zip'; // 设置类型:可以省略 // header("content-type:image/jpeg"); ...

  4. 吴裕雄 PYTHON 神经网络——TENSORFLOW 正则化

    import tensorflow as tf import matplotlib.pyplot as plt import numpy as np data = [] label = [] np.r ...

  5. Wireless-MCS

    MCS是modulation and coding scheme的缩写,可以翻译为调制和编码格式,我们可以选择配置该参数,来选择AP和Client之间传输的MCS rate,这些数据速率是使用shor ...

  6. 杭电 1203 I NEED A OFFER!

    I NEED A OFFER! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  7. socket中文奇数个出现乱码的解决办法

    用MyEclipse试了一下JAVA获取系统正在运行进程代码,结果Console输出的时候中文部分输出为乱码,在网上找了很多办法,都没有解决问题.后来发现一个方法,解决了问题,特此分享. 下面成功解决 ...

  8. Codeforces Round #592 (Div. 2)G(模拟)

    #define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;long long a[1000007],b[ ...

  9. idea提交项目到码云

    1.安装Git 2.在码云上创建项目 3.在IDEA提交项目到码云

  10. SpringBoot集成Freemarker前端模板

    1.在pom.xml中引入freemarker的jar包 <dependency> <groupId>org.springframework.boot</groupId& ...