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

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



 

 

ホンダビートPP1 車検落ちたので、ヘッドライト光量対策

 

前回の続きです。

www.te-tou.tokyo

車自体がもはやぼろいので、どれだけお金をかけられるか・捨てるべきか考えつつ車検対策を行います。

先日、車検を受けた際に「ヘッドライトの光量不足」で不合格になりました。

ちゃんとお金を払って「プロ」に任せることも考えつつ、ネットで検索したら「702kハイワッテージバルブ」なるものを発見しました。

 写真すらない怪しい感じでしたが、とりあえずポチって数日。

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

届きました。そして開封。

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

ちゃんと2個、届きました。

しかし、パッケージのノリがすでにはがれていて開封状態になっていました。おそらくかなりの長期間保管されていたものと思われます。

まあ、使えればOK。

702kなんてニッチなものが未だにあること自体が奇跡みたいなもんだと思います。

 

せっかくなので、交換前の状態で光量をスマホアプリで計測してみます。

(あくまで目安なので、全然信用できませんが。)

電球交換前ヘッドライト光量

右側から。

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

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

右下に1202...と表示されてます。たぶん12020くらい?

画面を指で押下した個所の光量を表示してくれるのですが、たぶんスマホのセンサーの性能とかもあるので全く正確ではないと思います。押下する場所によって値が全然ちがうので。あくまで参考です。

 

続いて、左側

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

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

こっちは13220くらい?

適当に車検時と同じくらいの値の場所を探してキャプチャしてます。

電球交換後ヘッドライト光量

右側

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

(当てにはなりませんが)光量測定に受かりそうな値が出ています。

左側

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

こちらも(当てにはなりませんが)光量測定に受かりそうな値が出ています。

 

ヘッドライトを磨く

光量不足の原因の一つに、ヘッドライトの黄ばみがあります。なので、研磨剤で磨いてみます。

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

ヘッドライト磨き

磨いてみると、表面のザラザラがとれてさわり心地がつるつるになりました。

でも、よく見てみると内側も黄ばんでいます。

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

ヘッドライト磨き後

ユニットを分解するのは大変なので、表面を磨いてコーティングして終わりにします。

抜本的な対策としては、ヘッドライトユニットの交換とハーネス引き直しとは思いますが額面が大きくなるので悩みどころです。

ヘッドライト磨き後の光量

右側

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

フラシーボ効果込みできれいに見えます。

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

左側

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

まあ、たいして変わらないのかな?

このアプリは用途が違うので、ヘッドライトの光量測定は全く当てにならないのですが気休めにはなりますね。

 まとめ

30年近く前の車なので、ヘッドライト自体も経年劣化するしHIDを使ってた時期もあるので反射板が焼けてしまったのかもしれません。

いずれにしろ、古い車を持つということは大変です。

とりあえず、出来る対策は打ったのでまた車検に挑戦してみます。

 

 

 

 

www.facebook.com

www.youtube.com