Django如何实现上传图片功能


Posted in Python onAugust 16, 2019

前言

很多时候我们要用到图片上传功能,如果图片一直用放在别的网站上,通过加载网址的方式来显示的话其实也挺麻烦的,我们通过使用 django-filer 这个模块实现将图片文件直接放在自己的网站上。

感兴趣的同学可以看下官方介绍:https://github.com/divio/django-filer

1. 使用 pip 安装。

pip install django-filer

这个模块需要 django-mptt, easy_thumbnails, django-polymorphic 以及 pillow 这些依赖包, 不过安装django-filer的时候 pip 都会自动帮我们装好这些。

2. django-filer 配置。

在 settings.py 中加入以下内容:

INSTALLED_APPS = [
  # 图片上传模块 django-filer
  'easy_thumbnails',
  'filer',
  'mptt',
]

# 支持视网膜高分辨率设备
THUMBNAIL_HIGH_RESOLUTION = True

# 处理缩列图
THUMBNAIL_PROCESSORS = (
  'easy_thumbnails.processors.colorspace',
  'easy_thumbnails.processors.autocrop',
  'filer.thumbnail_processors.scale_and_crop_with_subject_location',
  'easy_thumbnails.processors.filters',
)

# 存放图片文件夹设置
FILER_STORAGES = {
  'public': {
    'main': {
      'ENGINE': 'filer.storage.PublicFileSystemStorage',
      'OPTIONS': {
        'location': '项目路径/media/filer',
        'base_url': '/media/filer/',
      },
      'UPLOAD_TO': 'filer.utils.generate_filename.randomized',
      'UPLOAD_TO_PREFIX': 'filer_public',
    },
    'thumbnails': {
      'ENGINE': 'filer.storage.PublicFileSystemStorage',
      'OPTIONS': {
        'location': '项目路径/media/filer_thumbnails',
        'base_url': '/media/filer_thumbnails/',
      },
    },
  },
  'private': {
    'main': {
      'ENGINE': 'filer.storage.PrivateFileSystemStorage',
      'OPTIONS': {
        'location': '项目路径/smedia/filer',
        'base_url': '/smedia/filer/',
      },
      'UPLOAD_TO': 'filer.utils.generate_filename.randomized',
      'UPLOAD_TO_PREFIX': 'filer_public',
    },
    'thumbnails': {
      'ENGINE': 'filer.storage.PrivateFileSystemStorage',
      'OPTIONS': {
        'location': '项目路径/smedia/filer_thumbnails',
        'base_url': '/smedia/filer_thumbnails/',
      },
    },
  },
}
# 指定 MEDIA_URL 的位置
MEDIA_URL = '/media/'
MEIDA_ROOT = '项目路径/media/'

在上述设置中,location 是文件真正存放的文件夹地址,而 base_url 是显示时要指定的静态文件网址。

在 urls.py 中加入以下程序代码,才能把上传的图像文件当在静态文件处理:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
  # others urls ...
  url(r'^files/', include('filer.urls')),
  # ...
]
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEIDA_ROOT)

上述设置完成后,同步数据库 ./manage.py migrate,让模块加上需要的数据表。执行 ./manage.py collectstatic,刷新静态文件,加载 django-filer 自己的 CSS 和 Javascript 文件。我们便能在 admin 管理页面看到多出的两个数据表。

Django如何实现上传图片功能

接着我们就可以在 Folders 数据表中进行新建文件夹,上传文件以及删除文件夹和文件等操作。

3. 把 django-filer 的图像文件添加到数据表中

使用 filer 模块提供的 FilerImageField 字段,将上传图像文件的功能整合到建立的数据项中。

在 models.py 文件中添加:

from filer.fields.image import FilerImageField

并将需要放置图片的数据表中的 image 变量改为:

image = FilerImageField(related_name='product_image')

删除 migrations 下除 __init__.py 的其他文件和 db.sqlite3 文件,重新执行 ./manage.py makemigrations 和 ./manage.pymigrate ,刷新 admin 管理页面,进入 image 字段的数据项,便可以看到 image 字段多了上传文件的功能。

Django如何实现上传图片功能

我们便可以通过点击 Choose Files 上传文件了。

上传图片后,将 html 文件中 img 地址改为

<img src='{{product.image.url}}'>

便可以正确显示图片了。

Django如何实现上传图片功能

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
MySQL最常见的操作语句小结
May 07 Python
python通过imaplib模块读取gmail里邮件的方法
May 08 Python
详解Python编程中time模块的使用
Nov 20 Python
Swift 3.0在集合类数据结构上的一些新变化总结
Jul 11 Python
Python算法输出1-9数组形成的结果为100的所有运算式
Nov 03 Python
机器学习10大经典算法详解
Dec 07 Python
python3调用百度翻译API实现实时翻译
Aug 16 Python
Django框架实现分页显示内容的方法详解
May 10 Python
ubuntu 16.04下python版本切换的方法
Jun 14 Python
基于python实现可视化生成二维码工具
Jul 08 Python
Python logging模块原理解析及应用
Aug 13 Python
python中如何使用虚拟环境
Oct 14 Python
Python如何调用JS文件中的函数
Aug 16 #Python
用Python批量把文件复制到另一个文件夹的实现方法
Aug 16 #Python
Python Web框架之Django框架cookie和session用法分析
Aug 16 #Python
python中hasattr()、getattr()、setattr()函数的使用
Aug 16 #Python
Python中IP地址处理IPy模块的方法
Aug 16 #Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
Aug 16 #Python
Pyinstaller 打包exe教程及问题解决
Aug 16 #Python
You might like
php生成xml时添加CDATA标签的方法
2014/10/17 PHP
浅谈PHP中的数据传输CURL
2016/09/06 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
2017/07/16 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
通过jquery实现tab标签浏览效果
2007/02/20 Javascript
Prototype中dom对象方法汇总
2008/09/17 Javascript
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
js模仿windows桌面图标排列算法具体实现(附图)
2013/06/16 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
防止重复发送 Ajax 请求
2017/02/15 Javascript
前端主流框架vue学习笔记第一篇
2017/07/26 Javascript
Vue 表单控件绑定的实现示例
2017/08/11 Javascript
JS计算距当前时间的时间差实例
2017/12/29 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
Vue中的组件及路由使用实例代码详解
2019/05/22 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
python中ConfigParse模块的用法
2014/09/29 Python
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
Python实现冒泡排序的简单应用示例
2017/12/11 Python
python日期时间转为字符串或者格式化输出的实例
2018/05/29 Python
Python操作json的方法实例分析
2018/12/06 Python
Pycharm运行加载文本出现错误的解决方法
2019/06/27 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
python字典的遍历3种方法详解
2019/08/10 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
2020/02/20 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
Bose加拿大官方网站:美国知名音响品牌
2019/03/21 全球购物
六一节目主持词
2014/04/01 职场文书
期中考试复习计划
2015/01/19 职场文书
单位提档介绍信
2015/10/22 职场文书
一文搞懂如何实现Go 超时控制
2021/03/30 Python