1

Django でアプリケーションを開発していますが、Django テンプレート システムを使用して、テンプレートの継承を使用してブロックのオーバーライドを実現する方法がわかりません。

私はbase.htmlテンプレートを持っています:

[...]
<body>
{% block content %}
{% endblock %}
</body>
[...]

index.htmlJS スライダーを表示するテンプレートがあります (コンテンツはbodyタグに直接存在します)。

{% extends "base.html" %}

{% block content %}
// some javascript/css slider stuff here
{% endblock %}

また、いくつかの動的コンテンツ ページがあります: list.htmlform.htmlなど (それらのコンテンツはいくつかのdivコンテナーに存在する必要があります)。container.html私はどういうわけか次のように定義します:

{% extends "base.html" %}

{% block content %}
<div class="container marketing">
    <div class="container">
        {% put overriden "content" block here %}
    </div>
</div>
{% endblock %}

そして、次list.htmlのように定義できます。

{% extends "container.html" %} # note what I'm extending here!

{% block content %}
this is my list
{% endblock %}

なんで?

基本テンプレートをできるだけ一般的なものに保ちたい (例: クライアント側のスライダーを有効にする -divコンテナなし)。また、ほとんどの動的ページ (リスト、フォームなど) を同じ HTML コンテナー コードでラップしたいと考えています。このコードを繰り返したくないので、これは 1 つのテンプレート (リスト、フォームなどによって拡張されるテンプレート) で利用できる必要があります。

内部に別のブロックを定義できることはわかっています。しかし、おそらくより良い解決策がありますか?

4

2 に答える 2

4

私があなたを正しく理解していれば、実際に必要なのは、container.html が次のようになることです。

{% extends "base.html" %}

{% block content %}
<div class="container marketing">
    <div class="container">
        {% block content %}

        {% endblock %}
    </div>
</div>
{% endblock %}

contentcontainer.html を継承するテンプレートのブロックを再定義しているのでしょうか。

テンプレート言語そのものを変えないと無理だと思いますが、自分でもやりたいと思っていることです。プライマリ コンテンツを配置するブロック名を知るために、サブテンプレートが全幅テンプレートを継承するか、左側のサイドバー テンプレートを継承するか、基本テンプレートを継承するかを気にしなければならないのは好きではありません。

于 2013-03-16T13:29:12.763 に答える
0

最初の考えでは、2つのアプローチを持つことができると思います。

  • 内部コンテンツブロックの名前をcontent_innerに変更します
  • 2つ以上のブロックコンテンツテンプレートがあり、ビューまたは設定(またはセッションなど)からいずれかを拡張します。この最後のオプションを拡張するには:

base.html、content_col_right.html、content_col_left.htmlなど、およびcontent.html内:

{% extends variable_name %}

より多くのオプションがありますが、テンプレートhtml(IDとクラス)をビューコードに非常に添付します。好き

ヒント:コンテキストプロセッサを恐れずに、自分で作成してください。

于 2013-03-16T14:51:51.800 に答える