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
方法中,您查询所有 SellPostImage
s:
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
所以我的问题是,当我尝试查询图像 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
方法中,您查询所有 SellPostImage
s:
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