Djangoのカスタムラベル、フィルタ、およびinclusion_tag

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。

IMG

IMG

1.ディレクトリ構造

IMG

以下、このアプリを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 %}

上記のコードは、ユーザ名パラメータです。

おすすめ

転載: www.cnblogs.com/TMesh/p/11832782.html