Django多个图像用于后期渲染



在过去的几天里,我一直试图让管理员用户为每一篇帖子上传多个图像/幻灯片,我想到的一个想法是在帖子For循环中嵌套一个For循环,对于每一篇文章,也渲染与之相关的每一个图像,但似乎我做得不太好。

class Post(models.Model):
title = models.CharField(max_length = 128)
image = models.ImageField(default = 'default.jpg', upload_to = 'post_pics')
content = models.TextField()
date_posted = models.DateTimeField(default = timezone.now)
category = models.ForeignKey(Category, on_delete = models.CASCADE)
def __str__(self):
return f"{self.title} - {self.category}"

def get_image_filename(instance, filename):
title = instance.post.title 
slug = slugify(title)
return "post_images/%s-%s" % (slug, filename)

class Images(models.Model):
post = models.ForeignKey(Post, default= None, on_delete = models.CASCADE, related_name= 'Images')
image  = models.ImageField( upload_to = get_image_filename, verbose_name = 'Images')
def __str__(self):
return f"imazh per {self.post}"

和我的Html:

<div class="post-list-container">
{% for post in posts %}
<article class="post-container">

<div class="post-top">

> Focus on the for loop here
{% for post.Images in post.Images %}
<img src="{{ post.Images.url }}">
{% endfor %}
<div class="post-title"><a href="#"><h1>{{ post.title }} </h1></a></div>
<div class="post-images">
<img class="rounded" src="{{ post.image.url }}">
</div>

</div>


<div class="post-middle">

<div class="post-content"><p>   {{ post.content }}</p> </div>
</div>
<div class="post-bottom">

<div class="post-category"><a href="{% url 'by-category' post.category %}"><h2>{{ post.category }}</h2></a>
</div>
<div class="post-date_posted"><h1>{{ post.date_posted|date:"F d, Y" }}</h1>
</div>
</div>
</article>
{% endfor %}
</div>

有没有办法用这种方式渲染这些图像?

Post将有一个相关的集合,这就是您所说的反向关系.

默认情况下,django将使Post实例上的关系成为images_set,因为它在关系上使用您的模型名称&添加CCD_ 4。

也可以通过在FK字段上设置related_name属性来选择自己的相关名称。(文档(

下面是一个例子;

class Map(models.Model):
members = models.ManyToManyField(
User,
related_name='maps',
verbose_name=_('members')
)
# Reverse relationship:
User.maps.all()

或者在python中使用您的模型;

post = Post.objects.first()
print(f"Images in post {post.title}")
for image in post.images_set.all():
print(image.url)

因此,如果没有自定义的related_name,您的模板循环将类似于;

{% for image in post.images_set.all %}
<img src="{{ image.url }}">
{% empty %}
<p>No images found</p>
{% endfor %}

最新更新