post 渲染的 Django 多张图片

Django multiple images for post to render

在过去的几天里,我一直在尝试授予管理员用户权限,以便为每个 post 上传多个 images/slides,我想到的一个想法是在其中嵌套一个 for 循环posts for 循环,对于每个 post,也渲染与之关联的每个图像,但我似乎不太正确。

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 上建立关系,因为它在关系上采用您的模型名称并添加 _set.

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

举个例子;

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