Как отобразить изображения определенной записи в блоге?

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 %}

Я хочу, чтобы отображались изображения, относящиеся только к этому сообщению. Но здесь все изображения, объединенные для всех постов определенного пользователя, отображаются каждый раз в каждом посте. Как решить эту проблему?

Вы сами поставили себя перед такой дилеммой, вы можете исправить код представления, чтобы исправить это легко

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() для доступа к изображениям в посте.

Я бы предложил вам использовать related_name для post в ваших ImagePostModel. В вашем 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
    ).prefetch_related('imagespostmodel_set')
    context = {
        'posts': posts
    }
    return render(request, 'show_posts.html', context)

тогда в шаблоне можно получить доступ к .imagespostmodel_set из post:

{% for post in posts %}
    …
    {% for image in post.imagespostmodel_set.all %}
        {{image.post_id}}
        <img src="{{image.images.url}}" alt="postimage" style="width: 300px;">
        <br>
    {% endfor %}
    …
{% endfor %}

Примечание: Модели обычно не имеют суффикса Model. Поэтому лучше переименовать PostModel в Post.

Вернуться на верх