来自 ImageField 的图像不会加载到模板中

Images from ImageField doesn't load in a template

我正在创建一个房地产代理网站。每个报价都有几张照片,其中一张照片在管理面板中标记为主要照片后,应该显示在索引页上,但不幸的是它没有。

我认为问题出在 views.pyindex.html 中。 Settings.pyurls 似乎没问题,因为我可以通过在浏览器中输入图像的确切 url 来访问给定图像(例如 .../media/photos/name_of_the_image。 jpg) - 然后图像显示在浏览器中。

Models.py:

class Offer(models.Model):

    category = models.ForeignKey(Category)
    city = models.CharField(max_length=128)
    district = models.CharField(max_length=128)
    floor_space = models.IntegerField()
    price = models.IntegerField()

    def __unicode__(self):
        return "Offer nb %s" % (self.id)


class OfferImage(models.Model):

    offer = models.ForeignKey(Offer, related_name='images')
    images = models.ImageField(upload_to='photos/', blank=True, null=True)
    main_image = models.BooleanField(default=False)

Views.py:

def index(request):
    category_list = Category.objects.all
    latest_offers = Offer.objects.order_by('-pub_date')[:10]

    context_dict = {
        'categories': category_list,
        'latest_offers': latest_offers,
                    }

    return render(request, 'cardom/index.html', context_dict)

Urls.py:

urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'', include('cardom.urls')),
]

if settings.DEBUG:
    urlpatterns += patterns(
        'django.views.static',
        (r'^media/(?P<path>.*)',
         'serve',
         {'document_root': settings.MEDIA_ROOT}), )

if not settings.DEBUG:
        urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Index.html:

<div class="col-md-6">
<table class="table">
    {% for offer in latest_offers %}
    <tr><th>{{offer.category}}</th></tr>
    <tr><td><img src="{{ offer.images.url }}" height="120" width="200" alt="error"></td></tr>
    <tr><td>{{offer.city}} {{offer.district}} {{offer.floor_space}} {{offer.price}} </td></tr>
    {% endfor %}
</table><br />
</div>

问题出在哪里?

当你写:

{{ offer.images.url }}

你得到的是一个空字符串,因为 offer.images 是一个 RelatedManager,它没有 url 属性。

您应该使用专用管理器或视图中的其他查询来检索相应的图像:

main_images = offer.images.filter(main=True)
try:
    image = main_images[0]
except:
    image = None # Or whatever you want

您也可以通过向您的报价模型添加一个额外的属性 main_image 来避免这种情况(但您必须为管理员编写相应的逻辑)。