按高度/方向对图像进行排序

时间:2018-05-05 09:10:39

标签: python django django-views

我使用网格视图创建了图库,但我不喜欢行的样子 - 垂直照片会破坏所有内容。由于我不想手动更改图像顺序,我正在寻找一种通过图像高度或图像方向自动对它们进行排序的方法,因此垂直照片会在一行的底部进行排序。

这就是我在Django中的模型的样子:

class Photo(models.Model):
    title = models.CharField(max_length=150)
    image = models.ImageField()
    description = models.TextField(blank=True)
    category = models.IntegerField(choices=CATEGORIES)
    published = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title

这是我的grid_view:

def photos_grid(request):
    global cat_list
    photos = Photo.objects.order_by('published')
    output = {'photos': photos, 'categories': cat_list,}
    return render(request, 'photos/photos_grid.html', output)

我尝试了(how to find height and width of image for FileField Django)获取图片尺寸的方法,但我得到了

ValueError: invalid literal for int() with base 10: 'height'

我试图将它放在我的代码中的每一种方式。其他想法(通过手动获取views.py中的尺寸)有效,但我无法将其与我的照片放在一起,以便进行排序。

1 个答案:

答案 0 :(得分:1)

您必须在模型中包含高度和宽度字段,例如:

class Photo(models.Model):
    image = models.ImageField(height_field='image_height', width_field='image_width')
    image_height = models.IntegerField()
    image_width = models.IntegerField()
    ...

迁移数据库后,您可以编写以下内容:

Photo.objects.all().order_by('image_height')

编辑:如果您需要访问方向,请添加其他字段,例如:

class Photo(models.Model):
    ...
    aspect_ratio = models.FloatField(blank=True, null=True)

然后,覆盖你的save方法,用高度和宽度填充这个字段,即:

class Photo(models.Model):
    ...
    def save(self, **kwargs):
        self.aspect_ratio = float(self.image_height) / float(self.image_width)
        super(Photo, self).save(kwargs)

然后您可以按新字段订购,例如:

Photo.objects.all().order_by('aspect_ratio')