如何在Django中获取所有对象和相关图像

时间:2019-01-04 10:08:31

标签: django django-models django-views

过去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 = ..),我可以使它正常工作,但这只会返回一项。

我想要的最终结果:

  • 来自item1的图像_1,其中active = True
  • 来自item2的图像_1,其中active = True
  • 来自item2的image_2,其中active = True
  • 来自item3的image_1,其中active = True

1 个答案:

答案 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的文档。