Django モデルフォームを使わずにPost値を保存する

モデルフォームはとても便利ですが、すこし複雑な処理をするときはどこまでカスタムするかという問題も出てきます。

カスタム沼にはまり込んでしまうより、むしろモデルフォームを使わない方が楽な時があります。

以下は、チェックされた価格が設定されていない本に、まとめて同じ価格を設定するときの例です。

 

同じnameの複数パラメタは、request.POST.getlistで受け取ることができます。

 

参考サイト)

DjangoでGET/POSTから値を取得する方法

 

DjangoでSumの集計結果がNoneだった時に初期値を0にする

テーブルの一部のカラムの値をSumしていると、集計対象のレコードが存在しなかった場合、Sumの結果には通常Noneが返されます。

ここで処理が終わりであればよいのですが、その後そのSumした集計値を使っていろいろ計算を続ける場合、数値として認識されないため、その後の計算の結果もすべてNoneになってしまいます。

なので、もしSumした結果がNone(合計する行が存在しない場合も含め)であれば、0としておくと都合が良いことになります。

Coalesceを使います。

ポイントとしては、annotateが連続する場合、最後のannotateの中でCoalesceを使います。

annotateが連続しない場合、最初のSum時に、

とやってもOKです。

 

参考サイト)

JavaScriptでスマホがスリープから回復した時にカウントアップ(ダウン)を調整する

PWAアプリ化した場合でもそうなんですが、スマホをロックしたり自動で消灯した際、SetTimeoutの処理は一旦停止されます。その後画面を復帰させると、SetTimeoutの処理が再度復活します。

つまり、簡易ストップウォッチ機能とか、何かしらの時間測定をJS側で行っていると、スマホがスリープしていた時間はカウントされない場合があります。

今回はこの対策として、SetTimeout処理の中でスリープによってズレた時間を自動補正します。

HTMLには以下のように書いておきます。

SetTimeoutの中で、最終チェック時の経過時間からズレが5秒以上になったら自動的にズレた分を経過時間に追加します。(jQuery利用)

 

今回は簡易的なストップウォッチなのでこのような方法でやりましたが、欠点としては、ズレ補正の度に、若干(数ミリ秒ずつ)のずれが発生する可能性があります。

正確にズレ補正を行う場合は、計測スタート時に、開始時刻をミリ秒で記録しておくのが一番確実でしょう。