2016-07-21 17 views
1

私は、すでにbase.htmlを拡張しているビューに部分的なビューを拡張する方法があるかどうかを判断しようとしています。ここですでに拡張されているテンプレートをDjangoで拡張する

は私がやろうとしているものの例である:

私-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があります:

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

さらに、コンテキストdictがURLのIDを提供するmy_template_viewに渡されます。

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

しかし、今、私は/ my-でNoReverseMatchを取得しています:

私はタブなどのようなURLをレンダリングするために、それに対応する部分のためにクリックして、ユーザーのための希望しますテンプレート/ 97/tab1 /私は、私のtab1_viewはmy_template_viewと同じコンテキストにアクセスできないため、私のURLの逆を構築する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に沿って渡すために、非常に少なくとも、あるのでしょうか?

+0

エラーの原因となっているトレースバックまたはビュー/テンプレートコードが表示されていません。 – Alasdair

答えて

2

これを解決する典型的な方法は、新しいテンプレートで拡張するのではなく、includeテンプレートタグを使用することです。

Here is the Django doc describing this.

は、あなたもあなたのビュー内のロジックに基づいて含まれることになる動的なテンプレート名を定義するために変数を使用することができます。ここ

リトルより明確化:

また、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') 

そして、あなたのあなたが持っているでしょう

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

含まれているテンプレートは同じコンテキストを持つため、元のコンテキストで使用可能な変数にもアクセスできます。

+0

いいえ、これを試していましたが、クリックしたタブに基づいてmy-template.htmlにさまざまなビューを組み込む方法が不明でした。あなたはその論理の始まりを持っていますか? – moku

+0

:)最新の編集を確認してください。あなたはそれ以上のことが必要ですか? – cardonator

+0

ok私はほとんどそこにいるように感じますが、my_template_viewはクリック時にtab_nameをどのように取得しますか? – moku

関連する問題