使用Django2在指定尺寸保存图像,使用django-stdimage
首先
据Django官方和前辈们的博客所说,应该使用内置的ImageField来实现Django的图片上传功能。
然而,当我尝试在models.py中使用ImageField来上传和显示图片时,我对大小不一的图片感到非常失望。
我觉得只要将图片大小统一并上传,就应该没有问题,但我也觉得这样做有点多此一举,有点傻傻的。
在搜索保存位置或者显示位置时能否进行调整时,我遇到了django-stdimage。然而,我没有找到日语文档,所以我决定阅读官方Github页面(https://github.com/codingjoe/django-stdimage)并简单总结一下。
环境
Windows10
Python 3.6.0
Django 2.1.1
Windows10
Python 3.6.0
Django 2.1.1
Pillow的安装
安装Pillow来处理 ImageField(stdimage)。
安装django-stdimage。
安装Django标准化图像字段(django-stdimage)。
>pip安装django-stdimage
编辑settings.py
告诉INSTALLED_APP使用django-stdimage插件。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'news',
'stdimage', #追記
]
编辑models.py
在模型中添加属性。
上传图像的目标位置 upload_to 应根据所在环境进行设定。
from django.db import models
from stdimage.models import StdImageField #追記
class Post(models.Model):
title = models.CharField(max_length=150)
text = models.TextField(blank=True)
# 以下を追記
image = StdImageField(upload_to='path/to/img', blank=True, variations={
'large': (600, 400),
'thumbnail': (100, 100, True),
'medium': (300, 200),
})
执行迁移
编辑模型后,需要创建迁移文件。
>python manage.py makemigrations news
※将”news”替换为各自的应用程序名称。
执行数据迁移并将其应用到数据库中。
> python manage.py migrate
编辑模板
在这里,以新闻列表的显示作为示例。
显示发布日期、标题、正文和图片。
在models.py的Post类中,由于image使用了blank=True属性,所以在没有图片的情况下将其隐藏。
{% extends 'news/base.html' %}
{% block content %}
{% for post in posts %}
<div>
{{ post.created_datetime }}
</div>
<div>
<h1><a href="{% url 'news:detail' pk=post.pk %}">{{post.title}}</a></h1>
<p>{{ post.text|truncatechars:100 }}</p>
# 画像がある時のみ表示
{% if post.image %}
<p><a href="{{ post.image.url }}"><img alt="" src="{{ post.image.thumbnail.url }}"/></a></p>
{% endif %}
</div>
{% endfor %}
{% endblock content %}
这样的感觉。
显示”aaa”和”bbb”缩略图大小的图像。
“ccc”没有图像。

在 `models.py` 中的 `Post` 类中,我增加了对缩略图、中等尺寸和大尺寸的图片进行数据库存储的功能。
我尝试在新闻详细页面上显示每个尺寸的图片。
以下是模板的示例:
“`python
“`
{% extends 'news/base.html' %}
{% block content %}
<h1>{{ post.title }}</h1>
<p>{{ post.text|linebreaks }}</p>
{% if post.image %}
<p><a href="{{ post.image.url }}"><img alt="" src="{{ post.image.thumbnail.url }}"/></a></p>
<p><a href="{{ post.image.url }}"><img alt="" src="{{ post.image.medium.url }}"/></a></p>
<p><a href="{{ post.image.url }}"><img alt="" src="{{ post.image.large.url }}"/></a></p>
{% endif %}
{% endblock content %}

最后
似乎有多种指定Django图片大小并保存的方法。
经过初步调查发现,有ImageKit、sorl-thumbnail、stdimage等等。
(一开始试了试django-thumbs,但中途发现它只支持Python2…)
想试试各种不同的方法。