如何使用模板视图从 Django 一对多字段模型获取数据

How to get data from Django One to Many Fields Model using views into templates

我想显示 1 个 Parent 字段以及相关的 Child 以及 Childs

我有模特

class GrandParent(models.Model):
    name= models.CharField(max_length=50)
    ....

class Parent(models.Model):

    parent = models.ForeignKey(GrandParent, on_delete=models.CASCADE)
    name= models.CharField(max_length=50)
    ....

class Child(models.Models):
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
    name= models.CharField(max_length=50)
    ...

我可以从 Grand Parent 渲染 objects 但我无法 link 进一步 Parent Class objects 和 Child class objects 在模板中

我在views.py

中使用的这种方法
def list(request):
    object_list = GrandParent.published.all()
    ...
    return render('app/list.html')

def detail(request, post,):

    post = get_object_or_404(GrandParent, slug=post,
                        status='published')
                               
    return render(request, 'app/detail.html',
                            {'post' : post,
                            ...
                            
                            })

现在如何 link 在相同的详细信息视图中进一步 Classes 但与 Parent Classes 使用外键相关联。我正在关注 Django 文档,但他们只给出了最多 2 个使用 python shell 的示例,只有一个 subclass 我很困惑如何在这个结构中实现。或者任何人已经专门用这种类型的模型开发了任何项目,所以请分享任何 link 的 repo 或其他东西,会很棒。

#list.html {% 扩展“_base.html” %}

{% block title %} mysite{% endblock %}
{% block content %}


    <h2>Content </h2>

    
    <ul>
        {% for post in object_list %}
        <a href="{{ post.get_absolute_url }}">
            <li>{{ post.name}}</li></a>
                
        {% endfor %}
    </ul>
{% endblock %}

#detail.html

{% extends "_base.html" %}



{% block title %} freeStreams {% endblock %}
{% block content %}

<div class="card-body">
    <h1 class="card-title">{{ post.title }}</h1>

</div>
    
{% endblock %}

您可以通过 for 循环它的所有子项来访问视图模板中的一对多。在你的例子中,GrandParent by post.parent_set.all()Child parent.child_set.all()。您可以先在终端中尝试检查您的数据库和关系是否正确。

将其添加到块内 content

detail.html

        {% for parent in post.parent_set.all() %}
                <h1 class="card-title">{{ parent.name }}</h1>
                {% for child in parent.child_set.all() %}
                   <h2 class="card-title">{{ child.name }}</h2>
                    
                {% endfor %}    
        {% endfor %}