ディレクトリ
Djangoのカスタムラベル、フィルタ、およびinclusion_tag
カスタムフィルタ
図1に示すように、アプリの設定に登録されているか否かを判断します
2 appフォルダ(モジュール)(名前を変更することはできません***)でtemplatetagsを作成します。
mytag.py:3ランダムにモジュール名にPYファイルを作成します。
ステップ4(templatetagsは、ファイル内のフォルダ)、インポートテンプレート
django.templateインポートライブラリから
第二に、名前付きレジスタ変数= template.Libraryを(定義)
レジスタ=ライブラリ()
5書き込み(templatetagsフォルダ内の)機能、装飾@ register.filter(名=「YYY」)を見(エイリアスを指定することができます)
デフstr_add(STR1、STR2):#戻り値でなければなりません
#ビジネスロジックは複雑であり、
リターンSTR1 + str2の
:(テンプレート6)は、プログラムを再起動する必要があり、ラベル、フィルタの新しい定義を設定します
- {%負荷mytagというの%}
- {{ 'lqz' | str_add: 'NBを'}}
カスタムラベル
図1に示すように、アプリの設定に登録されているか否かを判断します
2(名前は変更できません)appフォルダ(モジュール)でtemplatetagsを作成します。
mytag.py:3ランダムにモジュール名にPYファイルを作成します。
ステップ4(templatetagsは、ファイル内のフォルダ)、インポートテンプレート
django.templateインポートライブラリから
第二に、名前付きレジスタ変数= template.Libraryを(定義)
レジスタ=ライブラリ()
5デコレータちょうど同じではありません(templatetagsファイルフォルダ内)
@ register.simple_tag()
デフadd_nb(値):
戻り値は+「NB」
テンプレート6つの:(複数のパラメータ、スペースで区切られました)
- {%負荷mytagというの%}
- {%add_nb 'lqz' %}
inclusion_tag
1 inclusion_tag
HTMLフラグメント(動的、送信パラメータ、データ転送)を生成します
2、以下のステップ:
次の-app新しいモジュール、templatetags
- PYファイル(mytag.py)を作成します
-from django.templateインポートライブラリ
-register =ライブラリ()-----名を登録するには、変更してはなりません
- 書き込みデコレータ(inclusion_tag)
- @ inclusion_tag( 'テンプレートパス'、名前= '名前の変更')
-def my_in():(書くことができない、パラメータを渡すためにスペースで使用される場合、より多く書き込むことができます)
- 論理処理の束、チェックデータベース
- RET = Book.object.all()
リターン{ '本':RET}
- テンプレート内:
本は、変数(テンプレートで参照され、この変数は、リストのリターンを表し冊です)することができ、
レンダリングページ
- アプリケーション:
- 別のテンプレートには:
- {%負荷mytag.py%}
- {%my_in%}
inclusion_tag()プロジェクト:
inclusion_tag()
原型:django.template.Library.inclusion_tag()
主な機能:テンプレートをレンダリングすることにより、いくつかのデータを表示します。
例えば、Djangoの管理インタフェースは、フォームページの下部にある「追加/変更」ボタンを表示するカスタムテンプレートタグを使用しています。これらのボタンは、常に同じように見えますが、リンクのターゲットを編集し、変更されたオブジェクトに基づいています。
タグのこのタイプは、「タグインクルージョン」と呼ばれるカスタムラベルに属します。
ケース(タブバーの左側をブログ)
ブログのメインページの左側の欄の記事やビューのブログにページの左側のフェンスのように。ためには、書き込みに同じコードを繰り返す必要がないように。そして、ページのスケーラビリティを向上させます。BBSの使用上の私の左の欄には、達成することinclusion_tag。
1.ディレクトリ構造
以下、このアプリをtemplatetagsプロジェクトのブログでファイルフォルダを作成します。このフォルダの名前は、名前のtemplatetagsでなければなりません。このファイルフォルダで、その後mytag.pyファイルをカスタマイズします。
2. mytag.py:
これは、返された結果と一致して異なるデータを、処理するための機能です。
from django import template
from django.db.models import Count
from blog import models
register = template.Library()
@register.inclusion_tag('classfication.html')
def get_calssfication_style(username):
user = models.UserInfo.objects.filter(username=username).first()
print(user.username)
blog=user.blog
nblog_id = user.blog_id
print(nblog_id)
cate_list = models.Category.objects.filter(blog_id=nblog_id).values("pk").annotate(c=Count("article__title")).values_list(
"title", "c")
print(cate_list)
tag_list = models.Tag.objects.filter(blog_id=nblog_id).values("pk").annotate(c=Count("article")).values_list("title", "c")
date_list = models.Article.objects.filter(user=user).extra(
select={"y_m_date": "date_format(create_time,'%%Y/%%m')"}).values("y_m_date").annotate(
c=Count("nid")).values_list("y_m_date", "c")
return {"blog": blog, "cate_list": cate_list, "date_list": date_list, "tag_list": tag_list,"username":username}
3.classfication.html
データが返さmytag.pyをレンダリングするために、
<div>
<div class="panel panel-warning">
<div class="panel-heading">我的标签</div>
<div class="panel-body">
{% for tag in tag_list %}
{% if username %}
{# <p><a href= "{{ username }}/tag/{{ tag.0 }}">{{ tag.0 }}({{ tag.1 }})</a></p>#}
<p><a href= "{% url 'blog_info' username=username condition='tag' param=tag.0 %}">{{ tag.0 }}({{ tag.1 }})</a></p>
{% endif %}
{% endfor %}
</div>
</div>
<div class="panel panel-danger">
<div class="panel-heading">随笔分类</div>
<div class="panel-body">
{% for cate in cate_list %}
<p><a href="/{{ username }}/category/{{ cate.0 }}">{{ cate.0 }}({{ cate.1 }})</a></p>
{% endfor %}
</div>
</div>
<div class="panel panel-success">
<div class="panel-heading">随笔归档</div>
<div class="panel-body">
{% for date in date_list %}
<p><a href="/{{ username }}/archive/{{ date.0 }}">{{ date.0 }}({{ date.1 }})</a></p>
{% endfor %}
</div>
</div>
</div>
4. base.html:
ここで私はbase.html上記classfication.htmlを参照する必要がある、あなただけの適切な場所に次の2つのコード行を追加する必要があります。
{% load mytag %}
{% left_panel username %}
上記のコードは、ユーザ名パラメータです。