Django:如何从django模板中的object_list索引图像

时间:2018-01-11 08:56:27

标签: python django

所以基本上我想知道如何使用for循环在django模板中索引图像。我们的想法是使用用户添加到模型中的前三个图像创建幻灯片放映

model.py

 class Product(models.Model):
    Name=models.CharField(max_length=120,null=True,blank=True)
    Category=models.CharField(max_length=80,null=True,blank=True)
    Image=models.ImageField(null=True,upload_to='Image')
    Description=models.TextField(null=True,blank=True)
    Price=models.DecimalField(default=0.00,max_digits=10,decimal_places=2)
    Delivery_date=models.DateTimeField(null=True,blank=True)
    Delivered=models.BooleanField(default=False)

这是模板,但obj.Image.url标签不完整,因为我只想要前三个项而不是循环但列出

{% for obj in object_list %}

{% if obj.Image %}
<ul class="pgwSlider">
    <li><img src="{{ obj.Image.url }}"></li>
    <li>
        <img src="">
        <span>Shanghai, China</span>
    </li>
</ul>
{% endif %}
{% endfor %}

2 个答案:

答案 0 :(得分:1)

如果您只想要3张图片(也许是最新图片,右图),您只需将自己的图片上下文从视图传送到模板。

也许您正在使用ListView,然后您必须使用get_context_data传递其他上下文数据。

这是get_context_data的简单用法。如果您想了解更多信息,可以查看django official documents for simple mixins(官方文档非常有用!)

您的视图示例

...
def get_context_data(self, **kwargs):
    context = super(YourListView).get_context_data(**kwargs)
    context['top_three_images'] = [
        product.Image.url
        for product in Product.objects.exclude(Image=None)[:3]
    ]
    return context
  

您可以使用自己的代码而不是列表理解。

然后您只需在模板中使用top_three_images即可。 您的模板

    {% for image_url in top_three_images %}
    <img src="{{ image_url}}" alt="">
    {% endfor %}
  

P.S。我建议您使用以lower_case开头的模型字段(即namecategoryimage ...)

更新

你想在循环中只显示前三个图像,对吗?

如果我理解正确,我认为foorloop.coutner可能会有所帮助。

在html中,您可以使用{% if forloop.counter < 4 %}(forloop以1开头)

{% for obj in object_list %}

{% if forloop.counter < 4 %}
<ul class="pgwSlider">
    <li><img src="{{ obj.Image.url }}"></li>
    <li>
        <img src="">
        <span>Shanghai, China</span>
    </li>
</ul>
{% endif %}
{% endfor %}

希望有所帮助。

答案 1 :(得分:0)

好吧我在模板标签的帮助下解决了这个问题。基本上我创建了

from django import template
from Products.models import Product

register=template.Library()

@register.filter
def id_check(value,arg):
    arg=arg+value
    context=Product.objects.get(id=arg)

    return context.Image.url

并且只在模板中运行了一个循环

{% for obj in object_list %}

{% if forloop.first %}


<ul class="pgwSlider">

    <li><img src="{{ obj.id|id_check:0}}" alt="Montral, QC, Canada" data-large-src="{{ obj.id|id_check:1}}"></li>
    <li><img src="{{ obj.id|id_check:1}}" alt="Canada" data-large-src="{{ obj.id|id_check:2}}" ></li>
    <li><img src="{{obj.id|id_check:2}}" alt="Montral, QC, Canada" data-large-src="{{ obj.id|id_check:10}}"></li>
    <li><img src="{{ obj.id|id_check:3}}" alt="Canada" data-large-src="{{ obj.id|id_check:7}}"></li>


</ul>

{% endif %}
{% endfor %}