过去2天,我一直在为此苦苦挣扎,我真的需要一些新的建议!
首先是我的配置:
models.py
class Category(models.Model):
name = models.CharField(max_length=200)
objects = models.Manager()
class Meta:
verbose_name_plural = 'categories'
def __str__(self):
return self.name
class Item(models.Model):
name = models.CharField(blank=False, max_length=200)
description = models.TextField(blank=False, null=True)
date = models.DateTimeField(blank=False, null=True)
category = models.ForeignKey(Category, blank=True, null=True, on_delete=models.SET_NULL)
order = models.IntegerField(blank=True, null=True)
active = models.BooleanField(blank=True, default=False)
objects = models.Manager()
class Meta:
verbose_name_plural = 'items'
class ItemImage(models.Model):
image = models.ImageField(blank=True, null=True)
order = models.IntegerField(blank=True, null=True)
main = models.BooleanField(blank=True, default=False)
cover = models.BooleanField(blank=True, default=False)
item = models.ForeignKey(Item, related_name='items', blank=True, null=True, on_delete=models.SET_NULL)
objects = models.Manager()
class Meta:
verbose_name_plural = 'item images'
views.py
def index(request):
all_items = Item.objects.filter(active=True)
pics = []
for a in all_items:
images = ItemImage.objects.filter(main=True)
pics.append(images)
propert = Item.objects.filter(active=True)
context = {
'pictures': pics
}
return render(request, 'gallery/index.html', context)
模板:
<div id="image-popups" class="grid">
{% for pic in pictures %}
<div class="item">
<img class="lazy" src="{{ pic.image.url }}"
data-mfp-src="{{ pic.image.url }}"
data-effect="mfp-zoom-in">
</div>
{% endfor %}
</div>
我的目标是获取所有过滤为“ active = True”的项目及其值为“ main = True”的所有相关图像。 我考虑过只使用“ main = True”过滤器查询ItemImage模型,但是将来我需要检索描述和名称。 我应该在这里使用ManyToMany关系吗?
如果我使用.objects.get(pk = ..),我可以使它正常工作,但这只会返回一项。
我想要的最终结果:
答案 0 :(得分:1)
我认为您可以通过以下方式简单地做到这一点:
查看:通过上下文发送所有图像项目查询集
def index(request):
context = {
'pictures': ItemImage.objects.filter(main=True).order_by('item')
}
return render(request, 'gallery/index.html', context)
模板:遍历图像项并显示它们
<div id="image-popups" class="grid">
{% for pic in pictures %}
<div class="item">
<img class="lazy" src="{{ pic.image.url }}"
data-mfp-src="{{ pic.image.url }}"
data-effect="mfp-zoom-in">
<p>{{ pic.item.name }}</p>
</div>
{% endfor %}
</div>
与活动项目中的图像有关的查询集:
ItemImage.objects.filter(main=True, item__active=True).order_by('item')
如果要显示单个项目的图像,则需要定义一个视图。您可以在此处使用DetailView。
假设您已经建立了一个视图,该视图返回一个Item(与当前的实现类似),然后可以在模板中显示与该项目相关的图像,如下所示:
{% for pic in item.itemimage_set.all %}
<img class="lazy" src="{{ pic.image.url }}"
data-mfp-src="{{ pic.image.url }}"
data-effect="mfp-zoom-in">
{% endfor %}
这称为相关对象。请参阅该here上的文档。
最后,假设您已经定义了视图,并且您的网址如下所示:
path('item/<pk:int>/', your_view, name="item-details"), # <-- defining name here is important
然后您可以像这样在gallery/index.html
中提供商品详细信息网址:
<div id="image-popups" class="grid">
{% for pic in pictures %}
<div class="item">
<img class="lazy" src="{{ pic.image.url }}"
data-mfp-src="{{ pic.image.url }}"
data-effect="mfp-zoom-in">
<a href={% url 'item-details' pic.item.pk %}>{{ pic.item.name }}</a>
</div>
{% endfor %}
</div>
有关命名的网址,请参阅有关url namespace的文档。