te-touのブログ

音楽制作・車・プログラミング・旅行・その他考えてる事など、備忘録的なことも含めて個人的なページです。

Django templateで変数を使う(with ~ as 変数名)ついでに文字連結




先日、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




www.facebook.com
www.youtube.com