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代码真的很爽
Aug 26 Python
Python入门篇之条件、循环
Oct 17 Python
Python中Scrapy爬虫图片处理详解
Nov 29 Python
python ansible服务及剧本编写
Dec 29 Python
django用户注册、登录、注销和用户扩展的示例
Mar 19 Python
Django框架实现的简单分页功能示例
Dec 04 Python
如何使用python爬虫爬取要登陆的网站
Jul 12 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
Python箱型图绘制与特征值获取过程解析
Oct 22 Python
使用Pyhton集合set()实现成果查漏的例子
Nov 24 Python
Python logging自定义字段输出及打印颜色
Nov 30 Python
PyQt5通过信号实现MVC的示例
Feb 06 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
PHP4之真OO
2006/10/09 PHP
PHP独立Session数据库存储操作类分享
2014/06/11 PHP
javascript 获取网页参数系统
2008/07/19 Javascript
jQuery中bind与live的用法及区别小结
2014/01/27 Javascript
JavaScript实现继承的4种方法总结
2014/10/16 Javascript
javascript中数组方法汇总
2015/07/07 Javascript
jQGrid动态填充select下拉框的选项值(动态填充)
2016/11/28 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
JS设计模式之数据访问对象模式的实例讲解
2017/09/30 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
2019/09/10 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
Vue用mixin合并重复代码的实现
2020/11/27 Vue.js
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
Python实现根据指定端口探测服务器/模块部署的方法
2014/08/25 Python
Python编程判断这天是这一年第几天的方法示例
2017/04/18 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
实例讲解python中的序列化知识点
2018/10/08 Python
Python代码实现删除一个list里面重复元素的方法
2019/04/02 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
咖啡书吧创业计划书
2014/01/13 职场文书
服务承诺口号
2014/05/22 职场文书
节约用水的口号
2014/06/20 职场文书
供用电专业求职信
2014/07/07 职场文书
元旦晚会活动总结
2014/07/09 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
2015年小学师德师风建设工作总结
2015/10/23 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
opencv读取视频并保存图像的方法
2021/06/04 Python