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操作摄像头截图实现远程监控的例子
Mar 25 Python
简单介绍Python中的len()函数的使用
Apr 07 Python
浅谈Python程序与C++程序的联合使用
Apr 07 Python
在Python中操作字典之clear()方法的使用
May 21 Python
Python安装Numpy和matplotlib的方法(推荐)
Nov 02 Python
解决python大批量读写.doc文件的问题
May 08 Python
python脚本实现验证码识别
Jun 07 Python
如何利用Boost.Python实现Python C/C++混合编程详解
Nov 08 Python
使用django的objects.filter()方法匹配多个关键字的方法
Jul 18 Python
python对csv文件追加写入列的方法
Aug 01 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
Python加载数据的5种不同方式(收藏)
Nov 13 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
简单采集了yahoo的一些数据
2007/02/14 PHP
PHP实现异步调用方法研究与分享
2011/10/27 PHP
php多任务程序实例解析
2014/07/19 PHP
php实现通用的信用卡验证类
2015/03/24 PHP
php使用指定编码导出mysql数据到csv文件的方法
2015/03/31 PHP
ThinkPHP框架实现的MySQL数据库备份功能示例
2018/05/24 PHP
JavaScript中的其他对象
2008/01/16 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
js的Boolean对象初始值示例
2014/03/04 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
Node.js学习入门
2017/01/03 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
vue构建单页面应用实战
2017/04/10 Javascript
Bootstrap Table列宽拖动的方法
2018/08/15 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
2019/04/17 Javascript
Vue.extend实现挂载到实例上的方法
2019/05/01 Javascript
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
Python之eval()函数危险性浅析
2014/07/03 Python
Python3如何解决字符编码问题详解
2017/04/23 Python
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
基于MUI框架使用HTML5实现的二维码扫描功能
2018/03/01 HTML / CSS
银河香水:Galaxy Perfume
2019/03/25 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
啤酒销售实习自我鉴定
2013/09/24 职场文书
高级销售员求职信
2013/10/25 职场文书
会计专业推荐信
2013/10/29 职场文书
团支书的期末学习总结自我评价
2013/11/01 职场文书
培训自我鉴定
2014/01/31 职场文书
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
《三袋麦子》教学反思
2014/03/02 职场文书
餐厅感恩节活动策划方案
2014/10/11 职场文书
Windows Server 修改远程桌面端口的实现
2022/06/25 Servers