从内嵌照片获取gallery thumb

时间:2014-01-13 15:49:04

标签: django django-models django-templates

我有一个画廊模型和一个照片模型。在我的照片模型中,我有一个布尔字段,用于选择图库缩略图。

class Gallery(models.Model):
    title = models.CharField(max_length=500, verbose_name="Tittel")

class Photo(models.Model):
    gallery = models.ForeignKey(Gallery, null=True, blank=True)
    image = ImageField(upload_to='uploads')
    frontpage_thumb = models.BooleanField(default=False)

这是我现在使用的代码,但这不是最好的方法:

{% for object in gallery_list %}
    <div class="post">

        {% for thumbnail in object.photo_set.all %}
            {% if thumbnail.frontpage_thumb %}<img src="{{MEDIA_URL}}{{ thumbnail.image }}">{% endif %}
        {% endfor %}

    </div>
{% endfor %}

任何人都有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用自定义ManagerQuerySet,如下所示:

class PhotoQuerySet(models.query.QuerySet):
    def frontpage_thumb(self):
        return self.filter(frontpage_thumb=True)

class PhotoManager(models.Manager):
    use_for_related_fields = True

    def get_queryset(self):
        return PhotoQuerySet(self.model)

class Photo(models.Model):
    # ...
    objects = PhotoManager()

然后你可以做以下事情:

# get first thumb for a gallery:
>>> g = Gallery.objects.all()[0]
>>> thumb = g.photo_set.all().frontpage_thumb()[0]

# or all thumbs for all galleries:
>>> all_thumbs = Photo.objects.all().frontpage_thumb()

由于您的架构不能保证每PhotoGallery设置为frontpage_thumb=True,因此您仍然需要在模板中获取结果的第一个元素, .0,就像上面的第一个Python示例一样:

{% for gallery in gallery_list %}
    <img src="{{ gallery.photo_set.all.frontpage_thumb.0.image.url }}">
{% endfor %}