1

我正在使用 Python(3.7) 和 Django(2.2) 开发一个项目,在该项目中我已经实现了两个模型ItemModelImages因此每个项目都会有多个图像并将项目添加到images模型中并添加一个related_name但是当我尝试访问这些图像时Django 模板没有提供有关这些图像的任何信息。

这是我的模型: 来自 models.py

class ItemModel(models.Model):
    stock_number = models.IntegerField(blank=False)
    title = models.CharField(max_length=255, blank=False)
    price = models.IntegerField(blank=False)
    description = models.TextField(max_length=1000)
    condition = models.CharField(max_length=255, choices=COND_CHOICES, blank=False)
    model = models.CharField(max_length=255)
    dimensions = models.CharField(max_length=255)
    make = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title


class Images(models.Model):
    item = models.ForeignKey(ItemModel, on_delete=models.CASCADE, related_name='images')
    image = models.ImageField(upload_to=images_directory_path)

更新:这是我用来重命名图像的功能:

def images_directory_path(instance, filename):
    return '/'.join(['images', str(instance.item.id), str(uuid.uuid4().hex + ".png")])

这是我正在尝试访问模板中某个项目的这些图像:

{% for img in item.images.all %}
    {% if forloop.first %}
        <td> {{ item.images.first.name }}</td>
    {% endif %}
{% endfor %}

这是视图:

来自views.py

class Inventory(View, LoginRequiredMixin):
    def get(self, request):
        items = None
        try:
            items = ItemModel.objects.all()
        except ItemModel.DoesNotExist:
            return redirect('home')

        return render(request, 'app/inventory.html', {'all_items': items})

这里有什么问题?

4

4 回答 4

1

看起来你只需要

{% for img in item.images.all %}
    {% if forloop.first %}
        <td> <img src="{{ img.image.url }}"/> </td>
    {% endif %}
{% endfor %}
于 2019-09-19T06:50:58.153 回答
0

您不需要 for 循环

<td> {{ item.images.first.name }}</td>

可以,因为它将返回第一张图像(如果存在),而不必遍历每张图像

于 2019-09-19T06:36:44.453 回答
0

除了 Rakesh 答案之外,您可能会发现有必要在通过添加另一个 if 语句来检索图像之前检查图像是否存在。

在您的模板中执行此操作;

{% for img in item.images.all %}
   {% if forloop.first %}
    {# add this if statement to check if the image exists in the table #}
       {% if img.image %}     
         <td><img src="{{ img.image.url }}"/></td>
       {% endif %}
   {% endif %}
 {% endfor %}
于 2019-09-19T13:39:49.320 回答
0

切勿访问相关名称,如下例所示:

{{ item.images.first.name }}

这将导致对数据库的新查询,而不是您应该像这样使用它:

{{ item.images.all.0.name }}

这不需要forloop,也将从视图中的原始查询中预取,只需在视图中的原始查询中添加.prefetch_related()。

于 2021-02-15T07:51:24.313 回答