Сортировка изображений по высоте / ориентации - PullRequest
0 голосов
/ 05 мая 2018

Я сделал галерею изображений с видом сетки, но мне не нравится, как выглядят строки - вертикальные фотографии разрушают все. Поскольку я не хочу вручную изменять порядок изображений, я ищу способ их автоматической сортировки по высоте изображения или просто по ориентации изображения, поэтому вертикальные фотографии уходят вниз в один ряд.

Вот так выглядит моя модель в 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)

Я пробовал ( как найти высоту и ширину изображения для FileField Django ) способ получения размеров изображения, но я получил

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

каждый раз, когда я пытаюсь вставить это в свой код. Другая идея (получение размеров вручную в views.py) работает, но я не могу поставить ее вместе с моими фотографиями в списке, чтобы она была отсортирована.

1 Ответ

0 голосов
/ 05 мая 2018

Вы должны включить в свою модель поля высоты и ширины, например:

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)

затем, переопределите ваш метод сохранения, чтобы заполнить это поле, используя высоту и ширину, т. Е .:

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')
...