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中的25个隐藏特性
Mar 30 Python
在Python中操作字典之fromkeys()方法的使用
May 21 Python
numpy中以文本的方式存储以及读取数据方法
Jun 04 Python
解决PySide+Python子线程更新UI线程的问题
Jan 11 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
May 07 Python
在Django中自定义filter并在template中的使用详解
May 19 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 Python
python报错: 'list' object has no attribute 'shape'的解决
Jul 15 Python
Python3 用什么IDE开发工具比较好
Nov 28 Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Jun 09 Python
python blinker 信号库
May 04 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 csv操作类代码
2009/12/14 PHP
php精确的统计在线人数的方法
2015/10/21 PHP
Yii视图CGridView列表用法实例分析
2016/07/12 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
PHP实现无限极分类的两种方式示例【递归和引用方式】
2019/03/25 PHP
PHP中的self关键字详解
2019/06/23 PHP
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
IFrame跨域高度自适应实现代码
2012/08/16 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
浅谈JSON和JSONP区别及jQuery的ajax jsonp的使用
2014/11/23 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
JavaScript sort数组排序方法和自我实现排序方法小结
2016/06/06 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
2016/10/04 Javascript
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
基于jquery实现多选下拉列表
2017/08/02 jQuery
AngularJS基于MVC的复杂操作实例讲解
2017/12/31 Javascript
VUE解决微信签名及SPA微信invalid signature问题(完美处理)
2019/03/29 Javascript
node.js基于socket.io快速实现一个实时通讯应用
2019/04/23 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
关于Python中浮点数精度处理的技巧总结
2017/08/10 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
Python 脚本实现淘宝准点秒杀功能
2019/11/13 Python
Java里面如何创建一个内部类的实例
2015/01/19 面试题
初中美术教学反思
2014/01/29 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
2014酒店客房部工作总结
2014/12/16 职场文书
收费员岗位职责
2015/02/14 职场文书
银行求职自荐信范文
2015/03/04 职场文书
大学生党员自我评价
2015/03/04 职场文书
新学期感想
2015/08/10 职场文书
python实现批量移动文件
2021/04/05 Python