使用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”没有图像。

image01.PNG

在 `models.py` 中的 `Post` 类中,我增加了对缩略图、中等尺寸和大尺寸的图片进行数据库存储的功能。
我尝试在新闻详细页面上显示每个尺寸的图片。
以下是模板的示例:
“`python
thumbnail
medium
large
“`


{% 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 %}
image02.PNG

最后

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

广告
将在 10 秒后关闭
bannerAds