首页 > 解决方案 > Django不显示图像

问题描述

我正在尝试使用 python 的 Django 框架构建一个电子商务网站,作为实践项目的一部分。但是,我无法在我的登录页面上显示我的产品图片。

Django 版本:3.2.4

模型.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="")

设置.py:

STATIC_URL = '/static/'

# Managing media
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

网址.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)

视图.py

def index(request):
    listings = Listing.objects.all()
    return render(request, 'auctions/index.html', {
        "listings": listings
    })

索引.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 属性。

标签: pythondjango

解决方案


正如@Pruthvi Barot 所提到的,您需要将您在 html 中使用的代码从

src="{% static listing.image %}" 

src="{% url listing.image.url %}"

那是因为您将图像作为媒体并允许它们通过您在此处定义的 url 提供服务:

# Managing media
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

在这种情况下,静态文件是您放置在目录中的图像,而不是从 Django 管理面板管理(上传和删除)。

@MojixCoder 提到的另一个解决方案是将上面提到的代码行替换为

src="{{ listing.image.url }}"

这是首选解决方案,并且是Django 官方文档中指定的 MEDIA_URL(版本 3.2)


推荐阅读