在Django中将上下文从子模板传递给父模板

Posted

技术标签:

【中文标题】在Django中将上下文从子模板传递给父模板【英文标题】:Passing context from child to parent template in Django 【发布时间】:2016-06-29 02:34:21 【问题描述】:

如何将子模板上使用的上下文传递给它继承自的父模板?

例子:

在views.py中

def author(request, code):
    author = get_object_or_404(Author, code=code)
    books = Book.objects.filter(author_id=author.id)
    reviews = Review.objects.filter(author_id=author)

    return render(request, 'foo/author.html', 'author': author, 'books': books, 'reviews': reviews)

在作者.html中

% extends 'base.html' %

在base.html中

% for book in books %
    <ul>
        <li> book.title </li>
        <li> book.year_published </li>
    </ul>
% endfor % 

这是用于父模板('base.html')内的导航栏。它会根据您所在的作者页面而变化。

【问题讨论】:

上下文中的变量应该已经在base.html 中可用。你不需要做任何事情。 他们不是。例如,当我尝试打印 base.html 中的 book.title 时,什么也没有发生。 您是否尝试过在您的视图中打印书籍? 是的,我有。它无法识别变量。 你能加入views.py代码吗? 【参考方案1】:

child.html 中的书籍创建一个新块。 child.html 上的这个 bookblock 应该覆盖存在于 base.html 中的 bookblock

% bookblock %
% for book in books %
    <ul>
        <li> book.title </li>
        <li> book.year_published </li>
    </ul>
% endfor % 
% endblock %

base.html

将与book 相关的代码放在一个块中,其中块名称在基模板和子模板上必须相同。

% bookblock %
% for book in books %
    <ul>
        <li> book.title </li>
        <li> book.year_published </li>
    </ul>
% endfor % 
% endblock %

【讨论】:

这是否意味着每当我必须创建基于上下文的导航栏时,我都必须添加一个单独的块?我的意思是,如果导航栏有两个上下文下拉菜单——一个用于书籍,一个用于评论——我必须为评论添加一个新块? 这种方法会得到所需的结果,但在代码维护方面并不理想,因为您必须在需要出现导航的每个 html 页面中重复此块。

以上是关于在Django中将上下文从子模板传递给父模板的主要内容,如果未能解决你的问题,请参考以下文章

Django 3:创建 CRUD 表模板(将上下文变量传递给 HTML)

使用 Ajax、Django 将上下文传递到模板中

如何在反应中将最新状态从子组件传递给父组件

React - 在下拉选择中将状态从子级传递给父级

Django模板继承下的动态数据传递—上下文处理器

Django 如何将自定义变量传递给上下文以在自定义管理模板中使用?