扩展已在 Django 中扩展的模板

mok*_*oku 3 python django

我想弄清楚是否有办法将局部视图扩展到已经扩展 base.html 的视图中。

这是我正在尝试做的一个例子:

我的模板.html

{% extends 'base.html '%}

<div class="row">
  <div class="col-xs-12">
    <ul class="nav nav-tabs">
      <li role="presentation" class="active"><a href="#">Tab1</a></li>
      <li role="presentation"><a href="#">Tab2</a></li>
    </ul>
  </div>
</div>

<div>
{% block tab_content %}
{% endblock %}
</div>
Run Code Online (Sandbox Code Playgroud)

部分1.html

{% extends 'my-template.html' %}

{% block tab_content %}
<h1>I'm partial 1</h1>
{% endblock %}
Run Code Online (Sandbox Code Playgroud)

my-template.html 视图的 url 构造如下:

url(r'^my-template/(?P<id>[0-9]+)/$', views.my_template_view, name='my-template')
Run Code Online (Sandbox Code Playgroud)

此外,上下文 dict 被传递到 my_template_view 中,为 url 提供 id。

我希望用户单击选项卡并使用如下所示的 url 呈现其相应的部分:

url(r'^my-template/(?P<id>[0-9]+)/tab1/$', views.tab1_view, name='tab1-view')
Run Code Online (Sandbox Code Playgroud)

但现在我在 /my-template/97/tab1/ 得到一个 NoReverseMatch,我假设这意味着我的 tab1_view 无法访问与 my_template_view 相同的上下文,因此无法获得要构建的 id我的网址的反面。

In template /partial1.html, error at line 0
Reverse for 'tab1_view' with arguments '('',)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['/my-template/(?P<id>[0-9]+)/tab1/$']
Run Code Online (Sandbox Code Playgroud)

那么,至少对我来说,有没有办法传递上下文或 id 以使其有效,或者我是否以完全错误的方式进行处理?

car*_*tor 6

解决这个问题的典型方法是使用include模板标签,而不是通过扩展新模板。

这是描述这一点的 Django 文档。

您甚至可以使用变量来定义动态模板名称,该名称将根据您的视图中的逻辑包含在内。

这里有更多的说明:

您还可以将 URL 路由直接指向同一视图,并可以选择将“选项卡”作为第二个参数传入,如下所示:

url(r'^my-template/(?P<id>[0-9]+)/(?P<tab_name>\w+)/$', views.my_template_view, name='my-template')
url(r'^my-template/(?P<id>[0-9]+)/$', views.my_template_view, name='my-template')
Run Code Online (Sandbox Code Playgroud)

您的视图将类似于:

def my_template_view(request, id, tab_name=None):
    if not tab_name:
        tab_name = "tab1"
    if tab_name == "tab1":
        partial = "tab1.django.html"
    elif tab_name == "tab2":
        partial = "tab2.django.html"
    return render("my-template.html", { 'partial': partial })
Run Code Online (Sandbox Code Playgroud)

在您的模板上,您将拥有:

{% include partial %}
Run Code Online (Sandbox Code Playgroud)

由于包含的模板将具有相同的上下文,因此您也可以访问原始上下文中可用的任何变量。

编辑 2020/09/04:如以下评论中所述,上述页面不再存在。我已将上述链接更新为 1.11 分支中的最新版本,但对于最新版本的 Django(本次编辑时为 3.1),您可以在此处参考相同的文档