今回は、テンプレートシステムの仕組みについて詳しく説明したいと思います。 それは完全にジャンジャンですが、その作り方は特筆に値します。 さらに、Djangoテンプレートエンジンに精通していない読者にも役立ちます。
柔軟性の原則
Biggoのコンストラクターで柔軟性はどのように達成されますか? 例を考えてみましょう。
各コンテンツオブジェクトには独自のURLがあり、要求に応じて、システムは目的のコンテンツを表示します。 URLに加えて、2種類のパターンも定義されています: 外部およびモジュール式 。 外部テンプレートの例:
articles.html :
{% extends "base.html" %}
{% block title %}{% if title %}{{ title }}{% else %}{{ block.super }}{% endif %}{% endblock %}
{% block content %}
<div id= "content" class = "box" >
<div class = "content-block box" >
{% BreadCrumbs %}
</div>
{% Articles %} {% CommentsAddForm www2 %}{% Comments www2 %}{% TagsCloud %}
</div>
{% endblock %}
* This source code was highlighted with Source Code Highlighter .
ご覧のとおり、base.htmlを継承し、タイトルとコンテンツブロックをオーバーライドします。
Base.html自体は次のようになります。
< html >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=utf-8" >
< link rel ="stylesheet" href ="/css/style.css" type ="text/css" media ="screen" >
< title > {% block title %} {% SiteCaption %} {% endblock %} </ title >
</ head >
< body >
{% block content %}{% endblock %}
</ body >
</ html >
* This source code was highlighted with Source Code Highlighter .
呼び出されたDjangoタグ{%Articles%}、{%CommentsAddForm www2%}、{%Comments www2%}、{%TagsCloud%}に注意してください。 これらは、記事、コメント、およびタグクラウドのモジュールのコンテンツを表します。 タグが呼び出される場所では、指定されたモジュールテンプレートに従って生成されたHTMLコンテンツが表示されます。
以下の記事の1つを例として考えてください。
< div class ="content-block box" >
< h3 >< span > {{ base_obj }} </ span ></ h3 >
{{ base_obj.details }}
{% for obj in lst %}
< dl class ="article box" >
{% if obj.get_image and obj.settings.show_image_on_page %} < dd class ="fl" >
< img src ="{{ obj|make_thumbnail }}" alt ="alt" ></ dd > {% endif %}
< dd class ="dt box" >
< strong class ="font19" >< a href ="{{ obj.get_absolute_url }}" > {{ obj }} </ a ></ strong >
< div class ="font13" > {{ obj.p_details }}{{ obj|obj_info:"html"|truncatewords:"20"}}
< br />< a href ="{{ obj|obj_info:" source_url " }}" > {{ obj|obj_info:"source" }} </ a >
</ div >
< dl class ="artinfo box font13" >
< dd class ="fl" >
{% if obj.p_dateadd %} < b > {{ obj.p_dateadd }} </ b > {% endif %}
</ dd >
< dd class ="fr" >
{{ obj|obj_info:"author" }}
</ dd >
< dd class ="fr tags" >
{% TagsBind obj.get_absolute_url %}
</ dd >
</ dl >
</ dd >
</ dl >
{% endfor %}
{% pagination %}
</ div >
* This source code was highlighted with Source Code Highlighter .
このテンプレートは、呼び出されたタグ{%Articles%}の表示を定義します。 内部には、さらに2つの包含タグの呼び出しがあることに注意してください:{%pagination%}および{%TagsBind%}
再帰呼び出し
一部のタグは、無制限のネストを実装するために自分自身を呼び出します。 例:
< ul class ="menu" >
{% for part in parts %}
< li >< a href ="{{ part.get_url }}" onmouseover ="{{ part.on_mouseover }}" > {{ part }} </ a >
{% for menu_obj in part.menu_set.all %}
{% Menu menu_obj.eng_word %}
{% endfor %}
</ li >
{% endfor %}
</ ul >
* This source code was highlighted with Source Code Highlighter .
{%Menu menu_obj.eng_word%}-対応する名前でサブメニューを呼び出します
テンプレートの継承の詳細。
Base.htmlページ(ベーステンプレート、親):
子テンプレート:
タグURLの依存関係
同じタグ({%Articles%}など)には、URLに応じて異なるコンテンツが表示される場合があります。 これは写真にはっきりと示されています。
PS私たちはハブロフスクの住民のコメントを考慮に入れました。 ポートフォリオを追加し、ドメインと他の小さなものの結合を強調しました。