January 30, 2021
←前回:Day 22 デバッグツールバーの導入
「Djangoを学びたい」とのことでありましたら[Day 1]Djangoの開発環境から読むことをおすすめします。
#はじめに
いつまでもdummyのままでは格好悪いのでサイドバーにカテゴリーが表示されるようにしていきましょう。
今回はテンプレートタグを自作していきます。
#カテゴリーを表示するテンプレートタグを作成する
まずテンプレートタグ用のテンプレートを用意します。
<div class="ui relaxed list small divided link">
{% for category in category_list %}
<a class="item">{{category.name}}({{category.count}})</a>
{% endfor %}
</div>
次にテンプレートタグを表示するロジック部分を作成します。thread/templatetagsディレクトリを作成し、その中にthreadtags.pyを作成します。
from django.template import Library
from django.db.models import Count
from ..models import Category
register = Library()
@register.inclusion_tag('thread/tags/category_tag.html')
def categorytag():
ctx = {}
ctx['category_list'] = Category.objects.annotate(
count=Count('topic')).order_by('sort')
return ctx
これはinclusiotn_tag関数のデコレータを使ってcategorytag関数をテンプレートタグとして登録しています。categorytag関数は単純にデータベースからクエリセットの評価によって得られたCategoryオブジェクトの辞書をコンテキストとして返す関数です。
このクエリセットですが、annotateを用いて各カテゴリーに属するトピックの数を数えて’count’という名前をつけて情報を付与しています。
このコンテキストがcategory_tag.htmlテンプレートに当てられます。では、登録したcategorytagを使ってみましょう。
templates/base/sidebar.htmlを書き換えます。
{% load threadtags %}
<div class="five wide column">
<div class="ui action input" style="width: 100%;">
<input type="text" placeholder="検索">
<button class="ui button"><i class="search icon"></i></button>
</div>
<div class="ui items">
<div class="item">
<a href="{% url 'thread:create_topic' %}" class="ui fluid teal button">トピックを作成</a>
</div>
</div>
<div class="ui segment">
<div class="content">
<div class="header"><h4>カテゴリー</h4></div>
{% categorytag %}
</div>
</div>
</div>
このようにcategorytagをロードして必要な場面で使うことで必ずしもビューからテンプレートにコンテキストを渡さなくても動的なページを作れることが分かりました。今回はinclusion_tagを用いましたがその他にもsimple_tag関数などが用意されており、引数を取る処理も書けます。
では確認してみましょう。localhost:8080にブラウザでアクセスします。
データベースに登録してあるカテゴリーとトピック数が表示されましたね。便利な機能ですので積極的に使っていきましょう。
#おわりに
昨日は大学で卒業研究の発表会がありWeb開発ができませんでした。
僕は3回生なので、見学しているだけかと思っていましたが、急遽司会をやらなくてはいけなくなり100人以上の前で(Zoomですが)司会進行をすることになってしまいました。
そういった経験があまりなく少し緊張しましたが、何とか回すことができました。
それではまたまた