如何显示特定博客 post 的图像?
How to display images of a particular Blog post?
models.py
class PostModel(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
date_time = models.DateTimeField(auto_now_add=True)
title = models.TextField(null=True)
body = models.TextField(null=True)
def __str__(self):
return str(self.user)
class ImagesPostModel(models.Model):
post = models.ForeignKey(PostModel, on_delete=models.CASCADE)
images = models.I
views.py
def show_posts(request):
posts = PostModel.objects.filter(user=request.user)
images = []
for post in posts:
images.append(ImagesPostModel.objects.filter(post=post))
context = {
'posts': posts,
'images': images,
}
return render(request, 'show_posts.html', context)
show_posts.html
{% extends 'base.html' %}
{% block content %}
{% for post in posts %}
{{post.title}}
<br>
{{post.body}}
<br>
{{post.data_time}}
<br>
{% for imgs in images %}
{% for image in imgs %}
{{image.post_id}}
<img src="{{image.images.url}}" alt="postimage" style="width: 300px;">
<br>
{% endfor %}
{% endfor %}
<hr>
<hr>
{% endfor %}
{% endblock %}
我想显示 post 的图像,这些图像仅与 post 相关。但是这里每次都会在每个 post 中显示特定用户的所有 post 的所有图像组合。如何解决?
你让自己陷入困境,你可以修复视图代码来轻松解决这个问题
def show_posts(request):
posts = PostModel.objects.filter(user=request.user)
for post in posts:
post.images = ImagesPostModel.objects.filter(post=post))
context = {
'posts': posts,
}
return render(request, 'show_posts.html', context)
然后在模板
中迭代post.images
或者您使用 post.images_set.all()
访问 post 图像。
我建议您在 ImagePostModel
中使用 related_name
作为 post
。在您的 models.py 中,您可以这样做。
class ImagesPostModel(models.Model):
post = models.ForeignKey(PostModel, on_delete=models.CASCADE, related_name="imagePost")
images = models.ImageField()
然后在您的模板中使用 {{ post.imagePost.all }}
您可以使用以下方法批量预取图像:
def show_posts(request):
posts = PostModel.objects.filter(
user=request.user
)<strong>.prefetch_related('imagespostmodel_set')</strong>
context = {
'posts': posts
}
return render(request, 'show_posts.html', context)
然后在模板中,您可以访问 post
的 .imagespostmodel_set
:
{% for post in posts %}
…
{% for image in post<strong>.imagespostmodel_set.all</strong> %}
{{image.post_id}}
<img src="{{image.images.url}}" alt="postimage" style="width: 300px;">
<br>
{% endfor %}
…
{% endfor %}
Note: Models normally have no Model
suffix. Therefore it might be better to rename PostModel
to Post
.
models.py
class PostModel(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
date_time = models.DateTimeField(auto_now_add=True)
title = models.TextField(null=True)
body = models.TextField(null=True)
def __str__(self):
return str(self.user)
class ImagesPostModel(models.Model):
post = models.ForeignKey(PostModel, on_delete=models.CASCADE)
images = models.I
views.py
def show_posts(request):
posts = PostModel.objects.filter(user=request.user)
images = []
for post in posts:
images.append(ImagesPostModel.objects.filter(post=post))
context = {
'posts': posts,
'images': images,
}
return render(request, 'show_posts.html', context)
show_posts.html
{% extends 'base.html' %}
{% block content %}
{% for post in posts %}
{{post.title}}
<br>
{{post.body}}
<br>
{{post.data_time}}
<br>
{% for imgs in images %}
{% for image in imgs %}
{{image.post_id}}
<img src="{{image.images.url}}" alt="postimage" style="width: 300px;">
<br>
{% endfor %}
{% endfor %}
<hr>
<hr>
{% endfor %}
{% endblock %}
我想显示 post 的图像,这些图像仅与 post 相关。但是这里每次都会在每个 post 中显示特定用户的所有 post 的所有图像组合。如何解决?
你让自己陷入困境,你可以修复视图代码来轻松解决这个问题
def show_posts(request):
posts = PostModel.objects.filter(user=request.user)
for post in posts:
post.images = ImagesPostModel.objects.filter(post=post))
context = {
'posts': posts,
}
return render(request, 'show_posts.html', context)
然后在模板
中迭代post.images或者您使用 post.images_set.all()
访问 post 图像。
我建议您在 ImagePostModel
中使用 related_name
作为 post
。在您的 models.py 中,您可以这样做。
class ImagesPostModel(models.Model):
post = models.ForeignKey(PostModel, on_delete=models.CASCADE, related_name="imagePost")
images = models.ImageField()
然后在您的模板中使用 {{ post.imagePost.all }}
您可以使用以下方法批量预取图像:
def show_posts(request):
posts = PostModel.objects.filter(
user=request.user
)<strong>.prefetch_related('imagespostmodel_set')</strong>
context = {
'posts': posts
}
return render(request, 'show_posts.html', context)
然后在模板中,您可以访问 post
的 .imagespostmodel_set
:
{% for post in posts %}
…
{% for image in post<strong>.imagespostmodel_set.all</strong> %}
{{image.post_id}}
<img src="{{image.images.url}}" alt="postimage" style="width: 300px;">
<br>
{% endfor %}
…
{% endfor %}
Note: Models normally have no
Model
suffix. Therefore it might be better to renametoPostModel
Post
.