【问题标题】:How to find first instance in django template如何在 django 模板中找到第一个实例
【发布时间】:2018-08-22 11:17:03
【问题描述】:

在我看来

   context ={
        "items":Items.objects.all(),
        "item_pics":Item_pics.objects.all(),
    }
    return render(request, 'menu/items.html', context)

我的对象“item_pics”看起来像这样

item_pics = [[{'item_id': 1, 'is_front': False, 'url': 'url_to_the_image1'},
             {'item_id': 1, 'is_front': False, 'url': 'url_to_the_image2'},
             {'item_id': 1, 'is_front': False, 'url': 'url_to_the_image3'},
             {'item_id': 1, 'is_front': False, 'url': 'url_to_the_image4'},
             {'item_id': 1, 'is_front': True, 'url': 'url_to_the_image5'},
             {'item_id': 1, 'is_front': True, 'url': 'url_to_the_image6'},
             {'item_id': 1, 'is_front': True, 'url': 'url_to_the_image7'},
             {'item_id': 1, 'is_front': True, 'url': 'url_to_the_image8'},
             {'item_id': 1, 'is_front': True, 'url': 'url_to_the_image9'}],
             [{'item_id': 2, 'is_front': False, 'url': 'url_to_the_image1'},
             {'item_id': 2, 'is_front': False, 'url': 'url_to_the_image2'},
             {'item_id': 2, 'is_front': False, 'url': 'url_to_the_image3'},
             {'item_id': 2, 'is_front': False, 'url': 'url_to_the_image4'},
             {'item_id': 2, 'is_front': False, 'url': 'url_to_the_image5'},
             {'item_id': 2, 'is_front': False, 'url': 'url_to_the_image6'},
             {'item_id': 2, 'is_front': False, 'url': 'url_to_the_image7'},
             {'item_id': 2, 'is_front': False, 'url': 'url_to_the_image8'},
             {'item_id': 2, 'is_front': False, 'url': 'url_to_the_image9'}]
             ]

我的模板

        {% for pic in item_pics %}
           {% if pic.is_front %}
               <img src="{{ pic.url }}"> 
           {% endif %}
        {% endfor %}

问题

如何选择pic.is_front == True的第一次出现然后停止for循环

另一个问题

如果pic.is_fron = Falseitem_pics 的每张照片,我想选择item_pics 的第一张照片

在 python 中会是这样的

for pics in item_pics:
    found = False
    for pic in pics:
        if pic['is_front'] == True and found == False:
            print(pic['item_id'], pic['url'])
            found = True
    if found == False:
        print(pics[0]['item_id'], pics[0]['url'])

【问题讨论】:

标签: django django-templates


【解决方案1】:

这最好在 python 代码中完成 - 在视图本身中,或者如果不可能,使用 custom template filter

在视图中

item_pics = [{'item_id': 1, 'is_front': False, 'url': 'url_to_the_image'},
         {'item_id': 1, 'is_front': False, 'url': 'url_to_the_image'},
         {'item_id': 1, 'is_front': False, 'url': 'url_to_the_image'}
         {'item_id': 1, 'is_front': False, 'url': 'url_to_the_image'}
         {'item_id': 1, 'is_front': True, 'url': 'url_to_the_image'}
         {'item_id': 1, 'is_front': True, 'url': 'url_to_the_image'}
         {'item_id': 1, 'is_front': True, 'url': 'url_to_the_image'}
         {'item_id': 1, 'is_front': True, 'url': 'url_to_the_image'}
         {'item_id': 1, 'is_front': True, 'url': 'url_to_the_image'}
         ]
 front_pic = None
 for pic in item_pics:
     if pic["is_front"]:
         front_pic = pic
         break
 else:
     front_pic = item_pics[0]
 context = {"item_pics": item_pics, "front_pic": front_pic}
 return render(....)

那么在你的模板中你除了直接使用front_pic之外别无他法。

使用自定义过滤器(参见文档链接以了解该代码的放置位置):

@register.filter
def get_front_pic(item_pics):
     for pic in item_pics:
         if pic["is_front"]:
             return pic
     return item_pics[0]

在您的模板中:

{% load front_pic from yourtaglib %}

{% with item_pics|get_front_pic as front_pic %}
<img src="{{ front_pic.url }}">
{% endwith %}

【讨论】:

  • @KostadinSlavov 作为一般规则,如果没有简单明了的方法可以直接在模板中执行,那么它属于 python 代码,如果您不能在视图中执行(因为您不拥有它)或不想在视图中执行它(因为您认为它实际上是一个仅用于演示的功能,而不是视图的责任)然后自定义标签和过滤器是您的朋友。
  • OMG...Facepalm context{"pics":item_pics.objects.all().order_by('is_front') 然后在模板中选择第一个就可以了
  • 这确实是另一种解决方案 但由于您将 item_pics 定义为字典列表,因此没有人可以给您这个答案。
  • 我很抱歉解释不好我的坏.. :( 真的很感谢你的回答@bruno 感谢你花时间写这个惊人的答案:) 谢谢你
  • @KostadinSlavov 不要抱歉,我只花了几分钟,对其他人有用(这是 SO 的重点)。
猜你喜欢
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2014-03-28
  • 2019-08-01
  • 1970-01-01
相关资源
最近更新 更多