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抓取淘宝下拉框关键词的方法
Jul 08 Python
Tornado 多进程实现分析详解
Jan 12 Python
Django 中使用流响应处理视频的方法
Jul 20 Python
python实现关闭第三方窗口的方法
Jun 28 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
python之yield和Generator深入解析
Sep 18 Python
基于python解线性矩阵方程(numpy中的matrix类)
Oct 21 Python
Windows下Anaconda安装、换源与更新的方法
Apr 17 Python
python进行参数传递的方法
May 12 Python
Python  word实现读取及导出代码解析
Jul 09 Python
解析python 类方法、对象方法、静态方法
Aug 15 Python
全面介绍python中很常用的单元测试框架unitest
Dec 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将fileterms函数返回的结果变成可读的形式
2011/04/21 PHP
探讨:如何编写PHP扩展
2013/06/13 PHP
PHP中的reflection反射机制测试例子
2014/08/05 PHP
js利用与或运算符优先级实现if else条件判断表达式
2010/04/15 Javascript
JQERY limittext 插件0.2版(长内容限制显示)
2010/08/27 Javascript
js函数名与form表单元素同名冲突的问题
2014/03/07 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
轻松创建nodejs服务器(2):nodejs服务器的构成分析
2014/12/18 NodeJs
js中 javascript:void(0) 用法详解
2015/08/11 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
基于Vuex无法观察到值变化的解决方法
2018/03/01 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
微信小程序实现上传word、txt、Excel、PPT等文件功能
2019/05/23 Javascript
vue-cli脚手架引入弹出层layer插件的几种方法
2019/06/24 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
python快速查找算法应用实例
2014/09/26 Python
Python利用ansible分发处理任务
2015/08/04 Python
Python搭建APNS苹果推送通知推送服务的相关模块使用指南
2016/06/02 Python
Python Nose框架编写测试用例方法
2017/10/26 Python
django 数据库连接模块解析及简单长连接改造方法
2019/08/29 Python
基于Python获取docx/doc文件内容代码解析
2020/02/17 Python
Python selenium使用autoIT上传附件过程详解
2020/05/26 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
Python内置函数及功能简介汇总
2020/10/13 Python
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
巴西宠物店在线:Geração Pet
2017/05/31 全球购物
奇怪的鱼:Weird Fish
2018/03/18 全球购物
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
中学生个人自我评价
2014/02/06 职场文书
小学生元旦广播稿
2014/02/21 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
多媒体教室标语
2014/06/26 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
教师辞职书范文
2015/02/26 职场文书
2016党员党章学习心得体会
2016/01/14 职场文书
浅谈redis的过期时间设置和过期删除机制
2022/03/18 MySQL