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 相关文章推荐
基础的十进制按位运算总结与在Python中的计算示例
Jun 28 Python
Python中的FTP通信模块ftplib的用法整理
Jul 08 Python
解决pandas使用read_csv()读取文件遇到的问题
Jun 15 Python
python输出100以内的质数与合数实例代码
Jul 08 Python
python实现彩票系统
Jun 28 Python
对python tkinter窗口弹出置顶的方法详解
Jun 14 Python
python实现简单五子棋游戏
Jun 18 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
Jun 28 Python
Python 生成VOC格式的标签实例
Mar 10 Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 Python
实现Python3数组旋转的3种算法实例
Sep 16 Python
python pygame 开发五子棋双人对弈
May 02 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实现数字补零功能的2个函数介绍
2014/05/12 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
Javascript 函数中的参数使用分析
2010/03/27 Javascript
firefox下frameset取不到值的解决方法
2010/09/06 Javascript
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
JS基于Ajax实现的网页Loading效果代码
2015/10/27 Javascript
分享JS数组求和与求最大值的方法
2016/08/11 Javascript
老生常谈javascript变量的命名规范和注释
2016/09/29 Javascript
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
webpack3里使用uglifyjs压缩js时打包报错的解决
2018/12/13 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
vue写h5页面的方法总结
2019/02/12 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
js单线程的本质 Event Loop解析
2019/10/29 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
Python字符遍历的艺术
2008/09/06 Python
python使用append合并两个数组的方法
2015/04/28 Python
python删除某个字符
2018/03/19 Python
python 日志增量抓取实现方法
2018/04/28 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
Python collections模块的使用方法
2020/10/09 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
Java基础面试题
2012/11/02 面试题
群教班子对照检查材料
2014/08/26 职场文书
2014迎接教师节演讲稿
2014/09/10 职场文书
公司备用金管理制度
2015/08/04 职场文书
2016关于预防职务犯罪的心得体会
2016/01/21 职场文书
Redis三种集群模式详解
2021/10/05 Redis
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS