Django 显示 related_name 列表中的第一项
Django Display first item from related_name list
我正在使用 Python(3.7) 和 Django(2.2) 开发一个项目,其中我实现了两个模型 ItemModel
和 Images
所以每个项目都有多个图像并将项目添加到 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)
Update: Here's the function i'm using to rename images:
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})
这里有什么问题吗?
您不需要 for 循环
<td> {{ item.images.first.name }}</td>
可以,因为它将 return 第一张图片(如果存在的话)而不必遍历每张图片
看来你刚好需要
{% for img in item.images.all %}
{% if forloop.first %}
<td> <img src="{{ img.image.url }}"/> </td>
{% endif %}
{% endfor %}
除了 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 %}
从不 访问相关名称,如下例所示:
{{ item.images.first.name }}
这将导致对数据库的新查询,而不是你应该这样使用它:
{{ item.images.all.0.name }}
这不需要forloop,而且这将从视图中的原始查询中预取,只需在视图中的原始查询中添加.prefetch_related()。
我正在使用 Python(3.7) 和 Django(2.2) 开发一个项目,其中我实现了两个模型 ItemModel
和 Images
所以每个项目都有多个图像并将项目添加到 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)
Update: Here's the function i'm using to rename images:
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})
这里有什么问题吗?
您不需要 for 循环
<td> {{ item.images.first.name }}</td>
可以,因为它将 return 第一张图片(如果存在的话)而不必遍历每张图片
看来你刚好需要
{% for img in item.images.all %}
{% if forloop.first %}
<td> <img src="{{ img.image.url }}"/> </td>
{% endif %}
{% endfor %}
除了 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 %}
从不 访问相关名称,如下例所示:
{{ item.images.first.name }}
这将导致对数据库的新查询,而不是你应该这样使用它:
{{ item.images.all.0.name }}
这不需要forloop,而且这将从视图中的原始查询中预取,只需在视图中的原始查询中添加.prefetch_related()。