2016-07-13 31 views
3

我正在尝试迭代模型以获取列表中的第一个图像,并且它给了我模型不可迭代的错误。以下是我的代码模型和模板。我只需要获取与单一产品相关的列表中的第一张图片。Django模型在模板中不可迭代

models.py:

class Product(models.Model): 
    title = models.CharField(max_length=500) 
    description = models.TextField(blank=True, null=True) 
    price = models.DecimalField(max_digits=20, decimal_places=2) 
    sku = models.CharField(null=True, max_length=100) 
    url = models.URLField(blank=True) 
    slug = models.SlugField(unique=True) 
    categories = models.ManyToManyField('Category', blank=True) 
    default = models.ForeignKey('Category', related_name='default_category', null=True, blank=True) 
    provider = models.ForeignKey('Product', on_delete=models.CASCADE) 

    def __unicode__(self): 
     return self.title 

    def get_absolute_url(self): 
     return reverse('product_detail', kwargs={"slug": self.slug}) 

    def get_image_url(self): 
     img = self.productimage_set.first() 
     if img: 
      return img.image.url 
     return img 
    def get_image_list(self): 
     return self.productimage_set.all() 

def image_upload_to(instance, filename): 
    title = instance.product.title 
    slug = slugify(title) 
    basename, file_extension = filename.rsplit('.', 1) 
    new_filename = '%s-%s.%s' % (basename, instance.id, file_extension) 
    return 'products/%s/%s' % (slug, new_filename) 

class ProductImage(models.Model): 
    product = models.ForeignKey(Product) 
    image = models.ImageField(upload_to=image_upload_to) 

    def __unicode__(self): 
     return self.product.title 

prduct_detail.html:

<div class="pics clearfix"> 
<div class="thumbs"> 
{% for img in product.get_image_list %} 
<div class="preview"> 
<a href="{{ img.get_absolute_url }}" class="selected" data-full="{{ img.image.url }}" data-title="title"> <img src="{{ img.image.url }}"> </a> 
</div> 
{% endfor %} 
</div> 
<div class="imglarge"> 
{% for img in object.productimage_set.all %} 

<a href="{{ object.get_absolute_url }}" class="full" title="title"> <img src="{{ img.image.url }}"> </a> 

{% endfor %} 

</div> 
</div> 

图像列表来了罚款,但第一图像不来了因为它要么显示了{% for img in object.productimage_set.first %}所有的图像就显示错误如下:

'ProductImage' object is not iterable 
Request Method: GET 
Request URL: http://localhost:8000/items-for-kids 
Django Version: 1.8.13 
Exception Type: TypeError 
Exception Value:  
'ProductImage' object is not iterable 
Exception Location: C:\Users\AliKhan\eCom\lib\site-packages\django\template\defaulttags.py in render, line 161 
Python Executable: C:\Users\AliKhan\eCom\Scripts\python.EXE 
Python Version: 2.7.9 

回答

2

你可以用它代替forwith标签,以避免错误:

更改此:

{% for img in object.productimage_set.first %} 
... 
{% endfor %} 

{% with img=object.productimage_set.first %} 
... 
{% endwith %} 
+1

它为我工作。谢谢 –

3

您使用all得到个所有的相关产品图像和遍历他们:

{% for img in object.productimage_set.all %} 

但是,如果你得到一个单一的对象,当你得到的第一个相关产品的形象一样,那么你不能重复:

{{ object.productimage_set.first }} 

这就是为什么你得到错误的原因

object is not iterable

你只有一个对象。如果您需要所有对象,则应考虑使用all