テンプレート フィルターの作成 [Django]

テンプレート フィルターの作成 [Django]


donald chi / 2017-03-17 14:56

音声ファイル作成中...
Audio: Visited: 1224


今回は、Djangoのテンプレート フィルター機能を使って 次のポストや前のポストデータを取り出す機能を実装しました。

Django projectでフィルター機能を自作することで、このフレームワークには ない機能をカスタマイズしたり、拡張したりすることが可能です。

あくまでも、今回自分の需要に応じて書いたプログラムです。

Step1

自分のプロジェクトの下にtemplatetagsという、フォルダーを作成し、 その下に自作したfilterファイルを置きます。

私の場合は、 myblog/templatetags/templatetagsになる。 一応、filterファイルの名前をpagetags.pyと命名し、以下のように書いて置きます。

pagetags.py
from django import template

register = template.Library()

@register.filter
def next(some_list, current_index):
    try:
        return some_list[int(current_index) + 1] # access the next element
    except:
        return '' # return empty string in case of exception

@register.filter
def previous(some_list, current_index):
    try:
        return some_list[int(current_index) - 1] # access the previous element
    except:
        return '' # return empty string in case of exception

Step2

template pageで{% load pagetags%}を含むことで、自作フィルターの関数を呼び出す。 具体的なコードは以下のようになります。

blog_listはdbから取得した、自分のブログ文章リストで、

{% with previous_post=blog_list|previous:forloop.counter0 %}
{% with next_post=blog_list|next:forloop.counter0 %}

の2行で、次の文章と前の文章を格納したオブジェクトを作ることが可能になります。 あとは取得した文章を表示するだけです。

{% load pagetags %}
<div >
{% for blog in blog_list %}
{% with previous_post=blog_list|previous:forloop.counter0 %}
{% with next_post=blog_list|next:forloop.counter0 %}
    {% if blog.title == object.title%}
        {% if  previous_post.title == ''%}
        <a href="#"><i class="fa fa-backward" aria-hidden="true" style="color: #54ba4e;"></i>No Previous Post</a>
        {% else%}
        <a href="{% url 'blog_details' slug=previous_post.slug %}"><i class="fa fa-backward" aria-hidden="true" style="color: #54ba4e;"></i>{{ previous_post.title }}</a>
        {% endif%}
        <br>
        {% if  next_post.title == ''%}
        <a href="#"><i class="fa fa-forward" aria-hidden="true" style="color: #54ba4e;"></i>No Next Post</a>
        {% else%}
        <a href="{% url 'blog_details' slug=next_post.slug %}"><i class="fa fa-forward" aria-hidden="true" style="color: #54ba4e;"></i>{{ next_post.title }}</a>
        {% endif%}
    {% endif %}
{% endwith %}
{% endwith %}
{% endfor %}
<div>

ハマっていた所

1. {% with %}で定義した変数を使い終わったらちゃんと{%endwith%}で閉じないとたまにエラーが出ていました。
2. templatetagsの下に自分のfilterファイル以外に __init__.pyというファイルを作って置かないとエラーが出ていました。

理由はまだ把握できていないですが、ひょっとしてtemplatetagsフォルダーを作成するときにmkdirではなく、djangoのコマンドを 使うのかな? あくまでも予測です。

参照文献

  1. 【Django】テンプレートフィルタを自分で作る
  2. Tutorial

0

0

Share with: Facebook Twitter Google+ LinkedIn Wechat Email Print

Comments: 0 件

There is no Comment now.

Add Comment

Name:
Email:
Comment: