作为练习项目的一部分,我正在尝试使用 python 的 Django 框架构建电子商务网站。但是,我无法在着陆页上显示我的产品图片。
Django 版本:3.2.4
models.py:
class Listing(models.Model):
title = models.CharField(max_length=100)
price = models.FloatField()
description = models.TextField()
image = models.ImageField(upload_to="auctions/images/", default="")
settings.py:
STATIC_URL = '/static/'
# Managing media
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
urls.py:
from django.contrib import admin
from django.urls import include, path
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path("admin/", admin.site.urls),
path("", include("auctions.urls"))
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
views.py
def index(request):
listings = Listing.objects.all()
return render(request, 'auctions/index.html', {
"listings": listings
})
index.html
{% extends "auctions/layout.html" %}
{% load static %}
{% block body %}
<h2>Active Listings</h2>
{% for listing in listings %}
<div class="card" style="width: 18rem;">
<img class="card-img-top" src="{% static listing.image %}" alt="Card image cap">
<div class="card-body">
<h5 class="card-title">{{ listing.title }}</h5>
<p class="card-text">{{ listing.description }}</p>
<p class="card-text">Price - {{ listing.price }}</p>
<a href="#" class="btn btn-primary">Bid</a>
</div>
</div>
{% endfor %}
{% endblock %}
我只获得了 img
标签的 alt 属性。
答案 0 :(得分:0)
正如@Pruthvi Barot 提到的,您需要更改您在 html 中使用的代码
src="{% static listing.image %}"
到
src="{% url listing.image.url %}"
这是因为您将图像作为媒体并允许它们通过您在此处定义的网址提供服务:
# Managing media
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
在这种情况下,静态文件是您放置在目录中且不从 Django 管理面板管理(上传和删除)的图像。
@MojixCoder 提到的另一个解决方案是将上面提到的代码行替换为
src="{{ listing.image.url }}"
这是首选的解决方案,也是 Djangos official documentation on MEDIA_URL(3.2 版)中指定的方案