这可能很简单,但确实让我头疼。我有一个多字模型 ListingImages
链接到另一个模型 Listing
。我正在检索 Listing
数据并使用它来访问 ListingImages
的对象。但是,我没有得到想要的结果。这是我的文件。
模型.py
class Listing(models.Model):
listing_title = models.CharField(max_length=255)
class ListingImages(models.Model):
listing = models.ForeignKey(Listing, on_delete=models.CASCADE)
image_url = models.ImageField(upload_to=get_image_filename,
verbose_name='Listing Images')
def get_image_filename(instance, filename):
title = instance.listing.listing_title
slug = slugify(title)
return "listings_pics/%s-%s" % (slug, filename)
View .py
def index(request):
context = {
'listings': Listing.objects.filter(status=True)
}
return render(request, 'base/index.html', context)
模板片段index.html
<!--Listing start-->
<div class="property-item col-lg-3 col-md-6 col-12 mb-40">
<div class="property-inner">
<div class="image">
<a href="single-properties.html"><img src="{{ listing.listingImages.image_url.url }}" alt=""></a>
<ul class="property-feature">
<li>
<span class="area"><img src="{% static 'base/assets/images/icons/area.png' %}" alt="">{{ listing.property.land_size }} SqFt</span>
</li>
<li>
<span class="bed"><img src="{% static 'base/assets/images/icons/bed.png' %}" alt="">{{ listing.property.bedrooms }}</span>
</li>
<li>
<span class="bath"><img src="{% static 'base/assets/images/icons/bath.png' %}" alt="">{{ listing.property.bathrooms }}</span>
</li>
<li>
<span class="parking"><img src="{% static 'base/assets/images/icons/parking.png' %}" alt="">{{ listing.property.car_spaces }}</span>
</li>
</ul>
</div>
<div class="content">
<div class="left">
<h3 class="title"><a href="single-properties.html">{{ listing.listing_title }}</a></h3>
<span class="location"><img src="{% static 'base/assets/images/icons/marker.png' %}" alt="">{{ listing.city }}</span>
</div>
<div class="right">
<div class="type-wrap">
<span class="price">Kshs {{ listing.property.price }}</span>
<span class="type">{{ listing.property.get_for_sale_rent_display }}</span>
</div>
</div>
</div>
</div>
</div>
<!--Listing end-->
但是,在模板中,我没有得到图像 url,而是得到了 <img src="(unknown)" alt="">
。我不知道我做错了什么,而且我也不知道如何引用多字模型 ListingImages
,是否应该是listingImages
或listing-images
或listing_images
。
最佳答案
直接回答您的问题:正确的调用是 listing.listingimages_set.all()
- 它将返回特定列表实例的所有列表图像的查询集。
此外,我建议不要将查询集传递给 django 模板。我认为最好从 python 原语构建模板上下文并传递它。这样就更容易调试和推理:
def index(request):
listings = Listing.objects.filter(status=True).prefetch_related('listingimages_set')
context = {
'listings': [
{
'title': listing.listing_title,
'images': list(listing.listingimages_set.all()),
} for listing in listings
]
}
return render(request, 'base/index.html', context)
然后您可以将模板中的列表图像引用为
<ul>
{% for listing in listings %}
<li>
{{ listing.title }}
<ul>
{% for image in listing.images %}
<li>{{ image.image_url }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
当然,这只是一个例子。但它表明,通过这种方式,您可以更好地控制模板上下文,并且可以在其内容最终出现在呈现的 HTML 页面中之前对其内容进行调试
顺便说一句,最常见和采用的约定是使用单个名词来调用模型。例如。 ListingImage
而不是 ListingImages
。
关于python - 在 Django 中引用多词模型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56796804/