【问题标题】:How to get all objects and related images in Django如何在 Django 中获取所有对象和相关图像
【发布时间】:2019-05-30 21:35:03
【问题描述】:

过去 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 模型,但将来某个时候我需要检索描述和名称。 我应该在这里使用多对多关系吗?

如果我使用 .objects.get(pk=..),我可以让它工作,但这只会返回一个项目。

我想要的最终结果:

  • 来自 item1 且 active=True 的 image_1
  • 来自 item2 的 image_1 且 active=True
  • image_2 来自 item2 且 active=True
  • 来自 item3 的 image_1 且 active=True

【问题讨论】:

  • 你在哪里使用 'a' - for a in all_items:
  • 可以在HTML页面的for循环中应用if条件
  • 抱歉,没完全理解你的想法,能否详细说明一下?

标签: django django-models django-views


【解决方案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

假设您已经构建了一个返回项目的视图(类似于您当前的实现),那么您可以在模板中显示与该项目相关的图像,如下所示:

{% 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 上的文档。

最后,假设您已经定义了视图并且您的 url 看起来像这样:

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,请参阅有关url namespace 的文档。

【讨论】:

  • 好的,这有点用,但我如何在项目模型中过滤“active=True”?此处的目的是能够切换模板中显示的项目及其相关图像。我还需要使用 .order_by('order') 订购商品。
  • 最终我希望在单击项目图像时使用相同的查询,以便打开一个新页面,我可以在其中查看与特定项目对象关联的所有图像
  • @reivan 请参阅更新部分。如果这个答案有帮助,please consider accepting it。谢谢
  • 天哪,终于成功了,非常感谢!!
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 2014-05-08
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2011-06-16
  • 1970-01-01
相关资源
最近更新 更多