扩展已在Django中扩展的模板

时间:2016-07-21 18:09:04

标签: python django

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

以下是我尝试做的一个例子:

我-template.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>

partial1.html

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

{% block tab_content %}
<h1>I'm partial 1</h1>
{% endblock %}

my-template.html视图有一个构造如下的网址:

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

另外,上下文字典被传递到my_template_view,提供url的id。

我希望用户点击一个标签,并使用相应的部分呈现其相应的部分:

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

但是现在我在/ 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/$']

那么,对我来说,至少有一种方法可以传递上下文或id以便这样做,或者我是以完全错误的方式解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

解决此问题的典型方法是使用include模板标记,而不是使用新模板进行扩展。

Here is the Django doc describing this.

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

这里没有更多的澄清:

您也可以将URL路由指向同一视图,并将“tab”作为第二个参数传递给它,如下所示:

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')

你的观点看起来像是:

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

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

{% include partial %}

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