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中pygame针对游戏窗口的显示方法实例分析(附源码)
Nov 11 Python
十个Python程序员易犯的错误
Dec 15 Python
Python处理命令行参数模块optpars用法实例分析
May 31 Python
PyCharm+PySpark远程调试的环境配置的方法
Nov 29 Python
django解决订单并发问题【推荐】
Jul 31 Python
django foreignkey外键使用的例子 相当于left join
Aug 06 Python
python生成器推导式用法简单示例
Oct 08 Python
使用matplotlib绘制图例标签中带有公式的图
Dec 13 Python
Django基于客户端下载文件实现方法
Apr 21 Python
利用Python实现朋友圈中的九宫格图片效果
Sep 03 Python
Python爬虫破解登陆哔哩哔哩的方法
Nov 17 Python
Python调用系统命令os.system()和os.popen()的实现
Dec 31 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
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
PHP正则表达式 /i, /is, /s, /isU等介绍
2014/10/23 PHP
Nginx环境下PHP flush失效的解决方法
2016/10/19 PHP
PHP实现执行外部程序的方法详解
2017/08/17 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
js实现字符串转日期格式的方法
2015/05/20 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
Bootstrap轮播插件使用代码
2016/10/11 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
element中Steps步骤条和Tabs标签页关联的解决
2020/12/08 Javascript
在Python编程过程中用单元测试法调试代码的介绍
2015/04/02 Python
Django卸载之后重新安装的方法
2017/03/15 Python
分析Python中解析构建数据知识
2018/01/20 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
ORM Django 终端打印 SQL 语句实现解析
2019/08/09 Python
HTML5之多线程(Web Worker)
2019/01/02 HTML / CSS
TheFork葡萄牙:欧洲领先的在线餐厅预订平台
2019/05/27 全球购物
英国鞋网:Rubber Sole
2020/03/03 全球购物
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
string = null 和string = ''的区别
2013/04/28 面试题
学习雷锋精神演讲稿
2014/05/10 职场文书
如何签定毕业生就业协议书
2014/09/28 职场文书
工作保证书怎么写
2015/02/28 职场文书
2015中学学校工作总结
2015/07/20 职场文书
创业计划书之闲置物品置换中心
2019/12/25 职场文书
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python
vue基于Teleport实现Modal组件
2021/05/31 Vue.js