如何显示特定博客 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.