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通过文件头判断文件类型
Oct 30 Python
python动态网页批量爬取
Feb 14 Python
pytorch 把MNIST数据集转换成图片和txt的方法
May 20 Python
python自动查询12306余票并发送邮箱提醒脚本
May 21 Python
Python机器学习库scikit-learn安装与基本使用教程
Jun 25 Python
python中文编码与json中文输出问题详解
Aug 24 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
Jan 08 Python
python爬虫爬取微博评论案例详解
Mar 27 Python
Python实现的ftp服务器功能详解【附源码下载】
Jun 26 Python
一行Python代码制作动态二维码的实现
Sep 09 Python
Python 实现黑客帝国中的字符雨的示例代码
Feb 20 Python
python 操作excel表格的方法
Dec 05 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运行环境配置的详解
2013/06/04 PHP
PHP版微信公众平台红包API
2015/04/02 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
js相册效果代码(点击创建即可)
2013/04/16 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
2013/12/11 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
理解javascript封装
2016/02/23 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
JS的Ajax与后端交互数据的实例
2018/08/08 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
vue中后端做Excel导出功能返回数据流前端的处理操作
2020/09/08 Javascript
Python continue语句用法实例
2014/03/11 Python
通过数据库向Django模型添加字段的示例
2015/07/21 Python
python实现实时监控文件的方法
2016/08/26 Python
基于Django模板中的数字自增(详解)
2017/09/05 Python
python3中property使用方法详解
2019/04/23 Python
python使用Matplotlib改变坐标轴的默认位置
2019/10/18 Python
python定义类self用法实例解析
2020/01/22 Python
Python reversed反转序列并生成可迭代对象
2020/10/22 Python
matplotlib自定义鼠标光标坐标格式的实现
2021/01/08 Python
Dower & Hall官网:英国小众轻奢珠宝品牌
2019/01/31 全球购物
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
英国第一独立滑雪板商店:The Snowboard Asylum
2020/01/16 全球购物
是什么让J2EE适合用来开发多层的分布式的应用
2015/01/16 面试题
Linux内核产生并发的原因
2016/11/08 面试题
2014工程部年度工作总结
2014/12/17 职场文书
整脏治乱工作简报
2015/07/21 职场文书
致运动员加油稿
2015/07/21 职场文书