python - 我的项目基于多图像。它没有在前端显示图像
问题描述
我的项目基本上是基于多图像的,HTML文件有问题。在这个项目中,我可以一次上传多张图片并一起查看。我可以上传图片,但它们无法在前端显示。帮我解决这个问题!因此,我的 html 文件是:base.html
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha2/css/bootstrap.min.css" integrity="sha384-DhY6onE6f3zzKbjUPRc2hOzGAdEf4/Dz+WJwBvEYL/lkkIsI3ihufq9hk9K4lVoK" crossorigin="anonymous">
<title>Multi Image Tutorial</title>
</head>
<body>
<div class="container py-4">
{% block content %}
{% endblock %}
</div>
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
</body>
</html>
博客.html
{% extends 'base.html' %}
{% block content %}
<div class="row row-cols-1 row-cols-md-2">
{% for post in posts %}
<div class="col mb-4">
<div class="card">
<div class="view overlay">
<img class="card-img-top" src="{{post.image.url}}"
alt="Card image cap" >
<a href="#">
<div class="mask rgba-white-slight"></div>
</a>
</div>
<div class="card-body">
<h4 class="card-title">{{post.title}}</h4>
<p class="card-text">{{post.description}}</p>
<a href="{% url 'detail' post.id %}" class="btn btn-primary btn-md">Read More</a>
</div>
</div>
</div>
{% endfor %}
</div>
{% endblock %}
详细信息.html
{% extends 'base.html' %}
{% block content %}
<div id="carouselExampleIndicators" class="carousel slide" data-mdb-ride="carousel">
<ol class="carousel-indicators">
{% for p in photos %}
<li data-mdb-target="#carouselExampleIndicators" data-mdb-slide-to="{{forloop.counter0}}" class="{% if forloop.counter0 == 0 %} active {% endif %}"></li>
{% endfor %}
</ol>
<div class="carousel-inner" role="listbox">
{% for p in photos %}
<div class="carousel-item {% if forloop.counter0 == 0 %} active {% endif %}">
<img
src="{{post.image.url}}"
class="d-block w-100"
alt="First slide"/>
</div>
{% endfor %}
</div>
<a
class="carousel-control-prev"
href="#carouselExampleIndicators"
role="button"
data-mdb-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span>
</a>
<a
class="carousel-control-next"
href="#carouselExampleIndicators"
role="button"
data-mdb-slide="next" >
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</a>
</div>
{% endblock %}
模型.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=120)
description = models.TextField()
image = models.ImageField(upload_to='products/', null=True, blank=True)
def __str__(self):
return self.title
class PostImage(models.Model):
post = models.ForeignKey(Post, default=None, on_delete=models.CASCADE)
image = models.ImageField(upload_to='images/')
def __str__(self):
return self.post.title
视图.py
from django.shortcuts import render, get_object_or_404
from .models import Post, PostImage
def blog_view(request):
posts = Post.objects.all()
return render(request, 'blog.html', {'posts':posts})
def detail_view(request, id):
post = get_object_or_404(Post, id=id)
photos = PostImage.objects.filter(post=post)
return render(request, 'detail.html', {
'post':post,
'photos':photos,
})
解决方案
看来你有两个模型之间的 1:m 关系,所以你需要使用Prefetch
posts = Post.objects.all().prefetch_related(
Prefetch(
'postimage_set',
PostImage.objects.filter(place='Main Product Image'),
to_attr='pimages'
),
)
在模板中,
{% for post in posts %}
...
<img src="{{ post.pimage.0.image.url }}">
{% endfor %}
模型.py
class PostImage(models.Model):
post = models.ForeignKey(Post, related_name='postimage_set', default=None, on_delete=models.CASCADE)
image = models.ImageField(upload_to='images/')
def __str__(self):
return self.post.title
推荐阅读
- python - Seaborn Distplot 在 y 轴上具有密度
- ios - 当我更改设备的方向时,为什么框架中的值比等于特定大小不做同样的工作?
- javascript - 使用变量设置传单圈 LatLng
- mysql - 按 ID 分组并显示该特定 ID 的多种颜色
- c# - Going about Testing an SSL Connection on RabbitMQ
- javascript - 通过仅包含数组属性子集的对象过滤 javascript 数组
- prolog - 找到至少一个由有限自动机接受的偶数长度的单词
- microsoft-graph-api - How to use Microsoft Graph API to get access to a private site in SharePoint
- javascript - 更改选项卡时如何使画布继续绘制
- azure - Start-AzAutomationRunbook 不断失败,并出现“未指定 Runbook 强制参数”。参数名称 ResourceGroupName。