先日、Djangoでviewsからtemplateへcontextを使って変数を渡す方法を書きました。
www.te-tou.tokyo
検索の仕方が悪いのか、単に理解不足なのかDjangoでの変数の使い方が分かりづらかったので備忘です。
熟知している人が書いてる説明は要領がとてもよく書いてあり、痒いところに手が届かない感じです。
今回はtemplateだけで変数を使う方法です。
環境
- python : 3系
- Django : version 3.0.2
用例
前回の記事と同じ用例とします。
ex)use case
かなりどうでも良い思いつきの用例です。細かいことは考えず、
今回nemeアプリというのを作ってテーブル項目(テーブル名:FullName)に氏名を持っているとします。
ついでだから、「つのだ☆ひろ」みたいに氏名の間に☆を入れようと思いつきました。
じゃあ、引数に☆を持たせて実装しよう。という流れです。
ソース
models
from django.db import model class FullName(models.Model) firstName = models.CharField( verbose_name = '名', #太郎 max_length=10, ) familyName = models.CharField( verbose_name = '氏', #テスト max_length=10, )
views
from django.shortcuts import render class FullNameListView(ListView): model = FullName, template_name = 'name/fullname_list.html' #使用するテンプレートを指定
viwsで変数を書く場合は、ここにget_context~みたいのを書きました。
urls
from django.contrib import admin from django.urls import path from name.views import FullNameListView urlpatterns = [ path('fullname', FullNameListView.as_view(), name="fullname"), path('admin/', admin.site.urls),
いつも通りパスを通して。
template (fullname_list.html)
{% with FullName.familyName|add:"☆"|add:FullName.firstName as NAMAE %} <div class="fullname"> {{NAMAE}} </div> {% endwith %}
これにより、変数「NAMAE」には「テスト☆太郎」が代入されます。
そして、templateに{{NAMAE}}と書けば「テスト☆太郎」が表示されます。
まとめ
{% with ~%} から {% endwith %} の間で指定した変数が有効になる模様。
上記例では、
{% with テーブル項目|add:"リテラル文字"|add:テーブル項目 as 変数名%}という記述で、「~|add:~」で文字連結をしています。
addは項目が数字項目の場合は、足し算となる。(ただし、整数として処理される。)
例えば、
X=1, Y=3 という項目の場合、「X|add:Y as ans」と書けば{{ ans }}には4という結果が代入されます。
しかし、
X=1.5, Y=3 という項目の場合、「X|add:Y as ans」と書くと{{ ans }}の結果は4となります。(あくまで整数)
小数点の計算をしたい場合は、カスタムタグを定義するようです。(数字を足し算ではなく文字連結したい場合も同様)
今の悩みは、2つ以上の引数を持つカスタムタグをどう作るかです。
→解決したので、下記の記事をどうぞ。
www.te-tou.tokyo