今更一から勉強しよう

勉強のノート。

Python、Djangoでオリジナルのシステム開発(5)

今日のやること

  • Djangoフォームで作成した画面で、編集時に特定の項目を変更不可にする
  • 一覧で削除時のモーダルウィンドウ表示

Djangoフォームで作成した画面で、編集時に特定の項目を変更不可にする

参考:Django入門|編集できないフォームフィールドに変更する方法|dot blog

forms.py(ModelForm)で初期化時にインスタンスが新規かどうか判定し、dsabled属性を追加する。

def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.instance.foodstaff_id is not None:
self.fields['foodstaff'].widget.attrs['disabled'] = 'disabled'

f:id:ebi40:20200405182106p:plain

これだけだとdisabledにした項目がPOSTされず、更新時にNot Null違反になる。
どうやらform.is_validの時点で、dsabledの値がNullになってしまうようだ。

f:id:ebi40:20200405182336p:plain

なので更新時は変数に退避しておいて、更新直前に設定するようにする。
もっとスマートなやりようはないだろうかと思うけど・・・
一応、Djangoフォームでの編集不可は実現できた。

f:id:ebi40:20200405183037p:plain

データ削除時のモーダルウィンドウ表示

参考:Modal · Bootstrap

Bootstrap公式のソースをコピペすればモーダル自体は実現できるが、各画面でこれを書くのは冗長すぎる。
viewでメッセージの内容を作ってHTMLに渡して、ベースのHTMLでモーダルの記述をメッセージ内容分ループするようにして汎用的に作る。

削除ボタンを個別から選択、一括削除に変更しようとする。

参考:一覧画面に削除機能を追加しよう — DjangoによるWebアプリケーション開発入門

<form method="post" action="{{ message.action }}">
としたいところで、逆引きURLを設定する方法がわからずにはまる。

参考:DjangoでのURL⇔view関数の正引き・逆引き - orangain flavor

やりたいことはできた・・・が、そもそも、モーダルをPOSTしたところで、
送りたいフォームはPOSTされないことに気が付いた。 送付したいFormをJavascriptで呼び出すよう細工する必要がある。

参考:【intra-mart】formタグの中で別のformを働かせる方法 | 株式会社アースリンク

f:id:ebi40:20200408222439p:plain

f:id:ebi40:20200408222514p:plain

f:id:ebi40:20200408222538p:plain

一応、できた。

後日やりたいこと

  • ボタン用フッター
  • 献立入力画面作成
  • ポップアップ選択
  • 一覧のページング
  • 賞味期限切れメール通知機能実装