te-touのブログ

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

Django ListViewで2つ以上の小数点を持つフィールドの計算結果を求める。(テンプレートタグ)





Djangoのテンプレートで四則演算を行うときの方法です。
単純にテンプレート上でA+Bみたいなことが出来なかったので調べました。

整数の計算であれば、前回の記事で書いた「項目1|add:項目2」のように書けば足し算してくれます。
www.te-tou.tokyo
しかし、小数点の計算計算は出来ません。

まさか四則演算でハマるとは思ってもいませんでしたが、これを実現するために関数を使う必要があるようです。
なので、「テンプレートタグ」というものを使います。

テンプレートフィルタとテンプレートタグの違い

ざくっと受けられる引数に違いがあるようです。

  • テンプレートフィルタ(引数2つまで)
  • テンプレートタグ(引数2つ以上使用可能)

今回は引数を2つ以上使いたいので、テンプレートタグを使用します。

環境
  • python : 3系
  • Django : version 3.0.2
用例

scoreというアプリがあるとします。テスト点数を入力してゆくアプリです。
そしてその入力したテストの点数の合計値をListViewで表示させます。
英語とかの点数に小数点はなかなかないとは思いますが、細かいことは考えず。
modelsの「scoreテーブル」に以下のフィールドを持っている。

  • 名前
  • 英語得点
  • 国語得点
  • 数学得点
  • 理科得点
  • 社会得点

ListViewで「英・国・数・理・社」の合計点数を表示する。

関数を作る(テンプレートタグ)

まず、templatetagsというフォルダをtemplatesと同じ階層に作成します。
そのフォルダの中にテンプレートタグ(関数)ファイルを作成します。
名前はなんでも良いので、sum_points.pyとします。
省略
┗score
 ┗templates
 ┗templatetags ←フォルダを作る。
  ┗sum_points.py ←テンプレートタグファイルを作成する。

sum_points.pyの中身

from django import template
#テンプレートライブラリに登録する
register = template.Library()
@register.simple_tag

#関数名はpoints
#引数5つを受け取り、足し算した結果を返り値へ送る
def points(value1, value2, value3, value4, value5):
    return value1 + value2 + value3 + value4 + value5
ソース

models

from django.db import model

class Score(models.Model)
          name = models.CharField(
                 verbose_name = '名',    
                 max_length=10,
           )
           #得点はフロート型で小数点以下を入力可能とする。
           engPoint = models.FloatField(
                 verbose_name='英語',
                 default=0.0
           )
           natPoint = models.FloatField(
                 verbose_name='国語',
                 default=0.0
           )
           matPoint = models.FloatField(
                 verbose_name='数学',
                 default=0.0
           )
           sciPoint = models.FloatField(
                 verbose_name='理科',
                 default=0.0
           )
           socPoint = models.FloatField(
                 verbose_name='社会',
                 default=0.0
           )

views

from django.shortcuts import render

class ScoreListView(ListView):
          model = Score,
          template_name = 'score/score_list.html'  #使用するテンプレートを指定

urls

from django.contrib import admin
from django.urls import path

from name.views import ScoreListView

urlpatterns = [
          path('score', ScoreListView.as_view(), name="score"),
          path('admin/', admin.site.urls),

いつも通りパスを通して。

template (score_list.html)

<div>
    {% for score in object_list %}
    <tr>
        <!-- リストの一番左にNoをカウントアップして自動的につける -->
        <td>{{ forloop.counter }}</td>

        <td>{{ score.name }}</td>

        <!-- 英国数理社の得点を入力 -->
        <td>{{ score.engPoint }}</td>
        <td>{{ score.natPoint }}</td>
        <td>{{ score.matPoint }}</td>
        <td>{{ score.sciPoint }}</td>
        <td>{{ score.socPoint }}</td>

        <!--  合計得点を表示する -->
        {% points score.engPoint score.natPoint score.matPoint score.sciPoint score.socPoint %}
        <!--  関数名・引数1・引数2・引数3・引数4・引数5 を書くと、結果が返り値として表示される -->
    </tr>
    {%  endfor %}
</div>
まとめ

これで同一レコードの四則演算が出来ます。
querysetだとテーブルに対してフィルタとかかけるような感じなので、用途が違いますね。もしかしたら、querysetとかでもっと賢い方法があるかもしれませんが。




www.facebook.com
www.youtube.com

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

Django ListViewで引数を使う(context)




int i = 90
char x = "変数"  とか、多分プログラミングの「さしすせそ」。
ですが、Djangoでこれのやり方がよく分からなかったので色々調べました。
備忘です。

環境
  • python : 3系
  • Django : version 3.0.2
用例

ex)use case
かなりどうでも良い思いつきの用例です。

細かいことは考えず、
今回nemeアプリというのを作ってテーブル項目(テーブル名:FullName)に氏名を持っているとします。
ついでだから、「つのだ☆ひろ」みたいに氏名の間に☆を入れようと思いつきました。
じゃあ、引数に☆を持たせて実装しよう。という流れです。

contextというのをViewsに書いて引数を設定し、templateで引数を受け取って画面に表示させます。

ソース

models

from django.db import models

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'  #使用するテンプレートを指定
          def get_context_data(self, **kwargs):
                context = super().get_context_data(**kwargs)
                context["star"] = "☆"
                return context

今回重要なのは、def get_context_data〜return contextのところですね。
context = super()でFullNameListViewクラスを上書き?オーバーライドしてる感じかと。
context["~"]で変数を作って、値を代入。
returnで変数を戻す(送る?)という感じかと思います。

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)

<div class="fullname">
         {{firstName }} {{star}} {{familyName}}
</div>

テンプレートに{{~}}で挟んで項目名(引数)を書けば、「苗字☆名前」のように表示される。
この辺りの受け渡しがなかなかややこしいな。というのが実感です。




www.facebook.com
www.youtube.com

めっちゃWi-Fi 都下ではつながった

 

最近、めっちゃWi-Fiがつながらないことが多いです。

www.te-tou.tokyo

 

しかし、今日の立川近辺では調子良いです。

f:id:te-tou:20200425204638p:plain

めっちゃWi-Fi 都下部では調子良い

なんか、場所によってつながる・つながらない(速度)が極端に違うみたいです。

 

ちなみに、4月25日の15時頃の高井戸周辺ではYahooすら開くのが困難な速度でした。

f:id:te-tou:20200425205124j:plain

ダウンロードが遅すぎて、全然読み込めてません。

まあ、この時期に大事なメッセージだけはちゃんと表示されてます。

 

同時刻に都心部と都下部で速度を計測していないので正確には分かりませんが、立川周辺では調子良さそうです。

 

あー、おうちで過ごしたい。

 

 

www.facebook.com

www.youtube.com

めっちゃWi-Fi 全然つながらない(遅い)

 

最近めっちゃWi-Fiが全然つながらなくて、ただの文句です。

 

めっちゃWi-Fiがめっちゃつながらないです。

または、つながってもめっちゃWi-Fiがめっちゃ遅いです。

f:id:te-tou:20200424192010j:plain

めっちゃWi-Fi 遅い

2020年4月24日の15時ごろ世田谷区付近の速度です。

使い物にならないくらい遅い。

www.te-tou.tokyo

 3月に速度を計測したときはこんな事にはならなかったのですが、最近リモートワークする人が増えたのが原因か分かりませんがとにかくつながらない。

今日は移動する必要があったので、立川〜調布〜川崎〜世田谷あたりにいました。

車で移動中にAmazon musicで音楽をかけていたのですが、ストリーミング再生すらできませんでした。なんなら、最悪はAmazon musicのトップ画面すら読み込めませんでした。

 

最近こんなことが多く、深夜でも同様の事象が発生します。

f:id:te-tou:20200425004039p:plain

めっちゃWi-Fi 死ぬほど遅い

2020年4月22日・午前1時ごろです。

もはや奇跡的な数値です。

 

制限がかかるようなネットワークの占有なぞしてません。

本体の電波はバリバリ入っています。

本体の電源を入れ直しても効果なし。

 

おそらく、どんなときもWi-Fiとかも同じ仕組みなので同じような事になっているのかとは思います。が、どんなときもWi-Fiは障害情報をサイトやツイッターで公開しているみたいですが、めっちゃWi-Fiにその手の情報公開の仕組みがないのか何が起こってるのか分かりません。

ただつながらないだけ。

 

ほんとかどうか分かりませんが、このクラウドSIMは使用上限なしと言っていますが実はキャリア側との契約で上限値が決まっている。なので利用者が多いと上限に引っかかって速度制限がかかり、翌月初になると解決する。とどっかのネット情報に書いてありました。

これじゃ仕事にならんです。

 

快適通信という宣伝文句を履行できてないので、無料で解約させてくれないかな?

 

でも、以前ニューメキシコでWi-Fiがつながらなくなった時よりも心穏やかです。

www.te-tou.tokyo

この手のトラブルは日本ならイライラする程度で済みますが、知らない地では最悪命の危険すら感じます。 

命の危険はないから、どうなるか少し様子を見る必要ありです。

 

 

 

www.facebook.com

www.youtube.com

ウェブアプリを作る。8(No migrations to apply)




(ローカル環境で開発中。SQLite3での話です。)
Djangoでアプリを作成中に一度マイグレーションをした後、テーブル定義を変更したくなりました。
そのため、models.pyを書き換え(add column)再びmakemigrationsを行ったところ幾多の問題にぶち当たりました。
f:id:te-tou:20200405012127p:plain
その(かなり強引な)解決法のなぐり書き備忘です。

その1

テーブルにデータが入ったままマイグレーション

./manage.py makemigrations
./manage.py maigrate

上記のコマンドを打っていると、「追加したカラムに初期値を設定してください。」的なメッセージが出ます。

You are trying to add a non-nullable field '~追加したカラム~' to user without a default;
we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null
value for this column)
 2) Quit, and let me add a default in models.py
Select an option:

1)を選択すると、初期値を設定する
2)を選択するとマイグレーションを一旦やめて、models.pyに初期値を設定する
みたいな感じだと思います。

そこで、1を選択して初期値を続けて入力します。
今回、初期値を入力した際に数値項目に文字列を入れてしまったようでおかしな事になりました。
とりあえず、migrateコマンドを打ってサーバーを起動して画面を確認しようとすると表示出来ません。

この対策としては、migrationsフォルダ内の「__init__.py」以外のファイルを削除します。
「__pycache__」フォルダは残して、その中のファイルも削除します。
とはいえ、いきなり削除は怖いので拡張子をリネーム(.pyXXXとか)しました。

これで再度makemigrationsコマンドを打って、createtableは成功しました。

その2
./manage.py maigrate

上記コマンドを打つと、ターミナルに

Running migrations:
No migrations to apply

マイグレーションを適用できません。的な。
多分、テーブルにデータが残ってたりするから更新がうまくできないのだろうと推測しました。
なので、db.sqlite3ファイルの中身を全削除して0バイトファイルにします。

その後、再びmaigrateコマンドを打って

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions, ~~~

無事に適用できました。

まとめ

テーブル定義を更新してマイグレーションに失敗したら以下の通り。

  • migrationsフォルダ内の「__init__.py」以外のファイルを削除
  • migrationsフォルダ内、「__pycache__」フォルダは残して、その中のファイルも削除
  • db.sqlite3ファイルの中身を全削除して0バイトファイルにする

www.facebook.com




ホンダビートPP1 光量不足解消で車検合格

 

先日ビートでユーザー車検に行って、ヘッドライトの光量不足で不合格になりました。

www.te-tou.tokyo

 そこでいろいろな対策を考えましたが、702kのハイワッテージバルブを購入し取り付けました。

www.te-tou.tokyo

で、本日再度車検へ向かいました。

結果は見事合格。

f:id:te-tou:20200404012029j:plain

ホンダビート 車検合格

毎回車検では紆余曲折あるのですが、今回も無事合格。

延命しました。

 

702kなんてニッチなバルブを使っていることが意味不明です。

今後のことを考えると、このハイワッテージバルブもいつなくなるか心配です。やはり根本的な見直しが必要な時期になってます。

 

今回再検査に行ったのですが、てっきり全項目やり直しかと思っていました。

しかし、前回の検査から2週間以内であれば、不合格箇所のみの検査で良いとのことで(待ち時間は別として)あっという間に検査終了しました。これは暁光。

 

もっと外装品をいじりたいのですが、機械部品がガタピシ言ってるのでなかなか手が届きません。

とりあえずは、めでたく合格でした。

f:id:te-tou:20200404012930j:plain

ホンダビート 車検

www.facebook.com

www.youtube.com