我正尝试基于多对多关系(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 %}
图像都按预期显示然而,顺序似乎总是相同的,无论我做什么。
有谁能给予我一个正确的方向?
任何建议都感激不尽。
谢谢。
2条答案
按热度按时间63lcw9qa1#
您是否尝试过在图像模型中设置排序选项?我知道您在直通关系表中设置了位置,但通过将其移动到图像模型(如果可能?)并在该模型上设置顺序,它应该可以工作。
6ie5vjzr2#
这是Django的一个奇怪之处,当使用
ManyToManyField
时,如果through模型提供了Meta.ordering
,它不会自动应用于相关条目的结果QuerySet。在您的示例中,您可以手动应用它
您还可以使用修改后的
ManyToManyField
,称为SortedManyToManyField
available https://github.com/django-ordered-model/django-ordered-model/blob/67bbc3a707202d4e201411284df0ca222255d3c7/ordered_model/fields.py,其优点是不必重复排序-它直接从 meta读取。