前言

django通过自带的ImageField可以实现图片上传,如果想在列表页面也显示图片缩略图的话,可以用django-stdimage插件来实现

django-stdimage

django-stdimage的github文档地址https://github.com/codingjoe/django-stdimage

实现以下功能的Django Field:

  • Django-Storages兼容(S3)
  • 将图像调整为不同大小
  • 访问模型级别的缩略图,不需要模板标签
  • 保留原始图像
  • 异步渲染(Celery&Co)
  • 多线程和处理以获得最佳性能
  • 限制接受的图像尺寸
  • 将文件重命名为标准化名称(使用可调用的upload_to)

环境准备,直接通过pip安装,最新版本Version: 4.0.1

pip install django-stdimage

并加入'stdimage'到INSTALLED_APP在你的settings.py

在settings.py配置上传文件的目录地址,参考前面一篇https://www.cnblogs.com/yoyoketang/p/10653878.html

MEDIA_URL = '/media/'

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

官方案例

变量在字典中指定。键将是引用已调整大小的图像的属性。变量可以定义为元组或字典。

from django.db import models
from stdimage.models import StdImageField class MyModel(models.Model):
# works just like django's ImageField
image = StdImageField(upload_to='path/to/img') # creates a thumbnail resized to maximum size to fit a 100x75 area
image = StdImageField(upload_to='path/to/img',
variations={'thumbnail': {'width': 100, 'height': 75}}) # is the same as dictionary-style call
image = StdImageField(upload_to='path/to/img', variations={'thumbnail': (100, 75)}) # creates a thumbnail resized to 100x100 croping if necessary
image = StdImageField(upload_to='path/to/img', variations={
'thumbnail': {"width": 100, "height": 100, "crop": True}
}) ## Full ammo here. Please note all the definitions below are equal
image = StdImageField(upload_to='path/to/img', blank=True, variations={
'large': (600, 400),
'thumbnail': (100, 100, True),
'medium': (300, 200),
})

用于在模板中使用生成的变量myimagefield.variation_name。如

<a href="{{ object.myimage.url }}"><img alt="" src="{{ object.myimage.thumbnail.url }}"/></a>

实践案例

通过上面的案例介绍,接下来写个实际的案例练习下

# models.py

from django.db import models
from django.utils import timezone
from datetime import datetime
from stdimage.models import StdImageField # Create your models here. class UploadImage(models.Model):
'''上传图片功能'''
name = models.CharField(max_length=30, verbose_name="名称", default="") # 标题
image = StdImageField(max_length=100,
upload_to='path/to',
verbose_name=u"传图片",
variations={'thumbnail': {'width': 100, 'height': 75}})
# 时间可编辑
add_time = models.DateTimeField(default=datetime.now, verbose_name=u"添加时间") def url(self):
if self.image:
return self.image.url
else:
return "url为空" def image_img(self):
if self.image:
href = self.image.url # 点击后显示的放大图片
src = self.image.thumbnail.url # 页面显示的缩略图
# 插入html代码
image_html = '<a href="%s" target="_blank" title="传图片"><img alt="" src="%s"/>'%(href, src)
return image_html
else:
return '上传图片' image_img.short_description = '图片'
image_img.allow_tags = True # 列表页显示图片 class Meta:
verbose_name = "传图片"
verbose_name_plural = verbose_name def __str__(self):
return self.name

adminx.py注册表信息

# adminx.py
import xadmin
from xadmin import views
from .models import UploadImage class ControlImage(object):
# 显示不要用image,而应该用image_img
list_display = ['name', 'image_img', 'url', 'add_time'] xadmin.site.register(UploadImage, ControlImage)

urls.py配置图片的URL地址访问,要不然查询详情的时候缩略图无法正常显示

from . import settings
from django.views.static import serve urlpatterns = [ url(r'^media/(?P<path>.*)$', serve, {"document_root": settings.MEDIA_ROOT}), ]

配置好之后,执行 makemigrations 和migrate,同步数据

python manage.py makemigrations

python manage.py migrate

xadmin后台显示

列表显示缩略图,点击可以放大

关于allow_tags的用法可以看下一篇https://www.cnblogs.com/yoyoketang/p/10659137.html

python测试开发django-48.xadmin上传图片django-stdimage的更多相关文章

  1. python测试开发django-47.xadmin上传图片和文件

    前言 xadmin上传图片和上传文件功能 依赖环境 如果没安装Pillow的话,会有报错:practise.Upload.upload_image: (fields.E210) Cannot use ...

  2. python测试开发django-44.xadmin上传图片和文件

    前言 xadmin上传图片和上传文件功能 依赖环境 如果没安装Pillow的话,会有报错:practise.Upload.upload_image: (fields.E210) Cannot use ...

  3. python测试开发django-36.一对一(OneToOneField)关系查询

    前言 前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示.本篇继续学习一对一(OneToOneField)关系的查询. 上一篇list_d ...

  4. python测试开发django-16.JsonResponse返回中文编码问题

    前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...

  5. python测试开发django-15.查询结果转json(serializers)

    前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...

  6. 2019第一期《python测试开发》课程,10月13号开学

    2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...

  7. python测试开发django-rest-framework-63.基于函数的视图(@api_view())

    前言 上一篇讲了基于类的视图,在REST framework中,你也可以使用常规的基于函数的视图.它提供了一组简单的装饰器,用来包装你的视图函数, 以确保视图函数会收到Request(而不是Djang ...

  8. 《Python测试开发技术栈—巴哥职场进化记》—前言

    写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...

  9. python测试开发django-197.django-celery-beat 定时任务

    前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...

  10. python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)

    前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...

随机推荐

  1. 如何从现有版本升级到element UI2.0?使用npm-check-updates

    转:https://blog.csdn.net/wojiaomaxiaoqi/article/details/78428738 登录element UI官网时提示2.0已经正式发布了,Element ...

  2. jquery里面的$.each()方法

    $.each可以迭代jquery对象和数组 $(selector).each()专注于jquery对象的遍历

  3. 自适应电脑、手机和iPad的网页设计方法

    随着3G的普及,越来越多的人使用手机上网. 移动设备正超过桌面设备,成为访问互联网的最常见终端.于是,网页设计师不得不面对一个难题:如何才能在不同大小的设备上呈现同样的网页? 手机的屏幕比较小,宽度通 ...

  4. 关于引用外部类要用static 的问题

    一.直接用 static 引用 import static net.mindview.util.Print.*; //net...为引用的类,此方法在程序加载时就已实例化 二. 也可以手动在需要时实例 ...

  5. GuzzleHttp 请求设置超时时间

    之前调用一个三方的 WEB API,大量的请求超时,导致 PHP 进程被占用完.整个网站一直报 504. 其中一个优化措施就是对三方 API 调用设置超时时间. use GuzzleHttp\Clie ...

  6. poj3579 二分套二分

    和poj3685类似,都是二分答案然后在判断时再二分 这题的内层二分可以用stl代替 /* 二分套二分,思路:升序排序数据,先二分答案x进行判断,判断时枚举每个元素,二分找到和其之差小于等于x的所有值 ...

  7. MySQL重复数据处理

    最近工作很忙,很久没写博客,嘻嘻!今天写一遍关于MySQL重复数据处理的博客!前不久有个开发问我,能不能把重复的数据去除,留下唯一的数据.然后我问他为什么有这么重复的数据呢,他说写了程序去爬数据,爬到 ...

  8. python 全栈开发,Day54(node.js初识)

    一.什么是Node.js 简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台.Node.js是一个事 ...

  9. BBC 记录片planet earth

    He'll have to remain on guard for another two weeks, but in the jungle, just surviving the day can c ...

  10. 【C++ Primer 第六章】 1. 定义模板

    类模板 题目描述:实现StrBlob的模板版本. /* Blob.h */ #include<iostream> #include<vector> #include<in ...