Django在模板中显示多对多-忽略排序?

ws51t4hk  于 2023-03-13  发布在  Go
关注(0)|答案(2)|浏览(104)

我正尝试基于多对多关系(Image / Gallery与中间Galleryimage模型)显示对象(Image)列表。
GalleryImage有一个名为position的附加字段,我想用它来管理图像在模板中列出的顺序。
我也有一个页面模型,可以选择有一个画廊附加到它。
我的模型看起来像这样:

class Page(models.Model):
    gallery = models.ForeignKey(Gallery, blank=True, null=True)
    slug = models.SlugField()
    title = models.CharField(max_length=200)
    content = models.TextField()

    def __unicode__(self):
        return self.title

class Image(models.Model):
    title = models.CharField(max_length=50)
    image = models.ImageField(upload_to='images')

    def __unicode__(self):
        return self.title

class Gallery(models.Model):
    title = models.CharField(max_length=50)
    images = models.ManyToManyField(Image, through='Galleryimage')

    def __unicode__(self):
        return self.title

class Galleryimage(models.Model):
    image = models.ForeignKey(Image)
    gallery = models.ForeignKey(Gallery)
    position = models.IntegerField()

    class Meta:
        ordering = ['position']

我在视图中检索页面模型,如下所示:

def detail(request, page_id):
    p = get_object_or_404(Page, pk=page_id)
    return render_to_response('detail.html', {'page': p},
                          context_instance=RequestContext(request))

最后,我在模板中显示图像,如下所示:

{% block images %}
{% if page.gallery %}
{% for image in page.gallery.images.all %}
<a rel="gallery" href="{{ STATIC_URL }}{{ image.image }}"></a>
{% endfor %}
{% endif %}
{% endblock %}

图像都按预期显示然而,顺序似乎总是相同的,无论我做什么。
有谁能给予我一个正确的方向?
任何建议都感激不尽。
谢谢。

63lcw9qa

63lcw9qa1#

您是否尝试过在图像模型中设置排序选项?我知道您在直通关系表中设置了位置,但通过将其移动到图像模型(如果可能?)并在该模型上设置顺序,它应该可以工作。

class Image(models.Model):
    title = models.CharField(max_length=50)
    image = models.ImageField(upload_to='images')
    position = models.IntegerField()

    def __unicode__(self):
        return self.title

    class Meta:
        ordering = ['position']
6ie5vjzr

6ie5vjzr2#

这是Django的一个奇怪之处,当使用ManyToManyField时,如果through模型提供了Meta.ordering,它不会自动应用于相关条目的结果QuerySet。
在您的示例中,您可以手动应用它

@register.filter
def order_by(queryset, args):
    args = [x.strip() for x in args.split(',')]
    return queryset.order_by(*args)

{% for image in page.gallery.images.all|order_by:"galleryimage__position" %}

您还可以使用修改后的ManyToManyField,称为SortedManyToManyField available https://github.com/django-ordered-model/django-ordered-model/blob/67bbc3a707202d4e201411284df0ca222255d3c7/ordered_model/fields.py,其优点是不必重复排序-它直接从 meta读取。

相关问题