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'
これだけだとdisabledにした項目がPOSTされず、更新時にNot Null違反になる。
どうやらform.is_validの時点で、dsabledの値がNullになってしまうようだ。
なので更新時は変数に退避しておいて、更新直前に設定するようにする。
もっとスマートなやりようはないだろうかと思うけど・・・
一応、Djangoフォームでの編集不可は実現できた。
データ削除時のモーダルウィンドウ表示
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を働かせる方法 | 株式会社アースリンク
一応、できた。
後日やりたいこと
- ボタン用フッター
- 献立入力画面作成
- ポップアップ選択
- 一覧のページング
- 賞味期限切れメール通知機能実装