Django:查询 ImageField 正在渲染所有图像

Django: Querying to ImageField all images are being rendered

所以我的问题是,当我尝试查询图像 url 时,它可以 post 编辑到其对应的 Post 所有已上传到媒体文件夹正在渲染,即使在管理面板中它显示每个 post 都有自己的图像并且它们被分配给不同的 posts,而不是所有它们都被一起渲染post.

我拥有的模型是 SellPost,用于创建 post,SellPostImage 用于将图像分配给 post。

models.py

class SellPost(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=128)
    category = models.ForeignKey(Category)
    type = models.ForeignKey(SellPostType, default=None)
    body = models.CharField(max_length=400)
    price = models.DecimalField(decimal_places=1, max_digits=5, default=0.0)
    views = models.IntegerField(default=0)
    likes = models.IntegerField(default=0)
    slug = models.SlugField(unique=True, default='automatic')

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(SellPost, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.title




class SellPostImage(models.Model):
    user = models.ForeignKey(User, null=True)
    post = models.ForeignKey(SellPost)
    pictures = models.ImageField(upload_to='post_images', blank=True)

    def __str__(self):
        return "{}".format(self.post)

    class Meta:
        verbose_name_plural = "Post Images"

在视图中,我尝试为 post 创建一个上下文字典(因为我是 Django 的新手,并且从 Tango 和 Django 那里学到了这一点,所以我选择了它),然后是图像:

views.py

def post(request, post_name_slug):

    context_dict = {}
    try:
        post = SellPost.objects.get(slug=post_name_slug)
        context_dict['post'] = post

        post_image = SellPostImage.objects.all()
        context_dict['post_image'] = post_image

    except SellPost.DoesNotExist:
        pass

    return render(request, 'p.html', context_dict)

这是我尝试在 HTML 文件中呈现它们的方式。

p.html

 <ul>
        {% for post in posts %}
        <li><a href="/p/{{ post.slug }}">{{ post.title }}</a> </li>
        {% for post_images in post_image %}

        <img style="width:200px; height:200px;" src="{{ post_images.pictures.url }}" />

    {% endfor %}
        {% endfor %}
    </ul>

在您的 post 方法中,您查询所有 SellPostImages:

post_image = SellPostImage.objects.all()

这就是为什么您要获取每个 post 的所有图像的原因。

您可以通过执行以下操作来仅过滤与 post 关联的图像:

post_image = SellPostImage.objects.filter(post=post)

它将提供特定 post 的所有图像。

您需要过滤 SellPostImage 以获得 post:

post = SellPost.objects.get(slug=post_name_slug)
context_dict['post'] = post

post_image = SellPostImage.objects.filter(post=post)
context_dict['post_image'] = post_image

但是您可以轻松地将逻辑部分直接放入您的模板中:

 {% for post in posts %}
    <li><a href="/p/{{ post.slug }}">{{ post.title }}</a> </li>
    {% for post_images in post.sellpostimage_set.all %}
      <img style="width:200px; height:200px;" src="{{ post_images.pictures.url }}" />
    {% endfor %}
{% endfor %}

然后您可以删除视图中的 SellPostImage:

try:
    post = SellPost.objects.get(slug=post_name_slug)
    context_dict['post'] = post
except SellPost.DoesNotExist:
    pass