Django 模板扩展:子级不覆盖父级

Posted

技术标签:

【中文标题】Django 模板扩展:子级不覆盖父级【英文标题】:Django Template Extends: Children not overriding parent 【发布时间】:2019-06-26 21:11:32 【问题描述】:

我运行 python manage.py runserver,它只显示父级 - base.html。根据documentation,它应该用子模板覆盖父模板:

模板继承允许您构建一个基本“骨架”模板,其中包含您网站的所有常见元素并定义子模板可以覆盖的块。

base.htmlbase_child.html 位于同一文件夹中:MyProject/MyApp/Templates/

views.py

def baseview(request):
    return render(request,'base.html')

这是我的模板:

base.html

<!DOCTYPE html>
<html lang="en">
<head>
    <title>
        % block titleblock %
        Hello World Title
        % endblock %
    </title>
</head>
<body>
    <p>
        % block bodyblock %
        Hello World!
        % endblock %
    </p>

</body>
</html>

base_child.html

% extends "base.html" %

% block titleblock %
Hello Grass title
% endblock %

% block bodyblock %
Hello Grass!
% endblock %

我相信this question的答案和cmets在描述中不清楚,这就是我提出这个的原因。

【问题讨论】:

【参考方案1】:

因为您将基本模板渲染到您的视图函数中。

def baseview(request):
   return render(request,'base.html')

当您渲染 base_child 模板时,它会覆盖父模板。

def baseview(request):
    return render(request,'child_base.html')

【讨论】:

太棒了,谢谢。简而言之,我想它只能在我选择它时覆盖。我在进行故障排除时遇到的问题是,当我应该删除 base_child 中的一个字段然后尝试您的答案时。再次感谢你:)【参考方案2】:

这两个模板都应该使用不同的视图和 url 呈现,如下所示:

urls.py 用于基础:

url(r'base/$', views.baseview),

用于基础的views.py:

def baseview(request):
   return render(request,'base.html')

孩子的urls.py:

url(r'child/$', views.childview),

views.py 为孩子:

def childview(request):
   return render(request,'base_child.html') 

现在当你输入

localhost:8000/base/

在您的浏览器网址中,它将显示 base title

如果你输入

localhost:8000/child/

在您的浏览器 url 中,它将用子 title 覆盖基本 title

【讨论】:

根据问题你的回答是正确的。您提供了如何根据情况在不同视图中使用这两个模板的详细信息。我对任何人都投了反对票。@Ahtisham

以上是关于Django 模板扩展:子级不覆盖父级的主要内容,如果未能解决你的问题,请参考以下文章

如果父级不调用 wait(),则同一父级的两个子级不使用管道进行通信

C++ 虚拟方法:我必须在父类中为子级和父级不共享的每个方法创建一个虚拟方法吗?

Django:覆盖和扩展应用程序模板

Django 模板:通过扩展模板覆盖包含的子模板块

在 django admin 中覆盖模板

来自自定义 LinearLayout 的子级不显示波纹效果