Blank?=False

ゆるゆる仕事したいフリーランスエンジニアの記事

Djangoで連動するセレクタを作る

Djangoで連動するセレクタを作ってみました。 下記の3点を組み合わせます。

連動するセレクタとは?

下のような感じで、ParentのSelectでAを選択したときはChildはAの子となる要素のみ選択でき、

f:id:stonebeach-dakar:20210918090305p:plain

ParentでBを選択したときはChildはBの子要素のみ選択できる f:id:stonebeach-dakar:20210918090614p:plain

こういうタイプのセレクタです。

モデルを作成

今回は単純にParents, Childrenというモデルにしています。

models.py

フォームを作成

Select ウィジェットを継承したChildSelectクラスを作成。 ChildSelectが作成するoption要素にparent_id属性を追加し,親のidを設定します。

ちなみに、forms内でchoicesを設定していますが、単純に設定するとデータが変わってもサーバーがリロードされるまでセレクタの内容が変わりません。 コレを防ぐため、lambdaで関数オブジェクトとしています。

forms.py

テンプレートを作成

javascriptで、SelectFormクラスが生成するSelectタグ内の内容を変更します。

動きとしては下記のようになります。 ・Parentセレクタの変更をイベントのトリガーと設定 ・選択しているParentのIDと違うChildのoptionを削除

template.html

参考サイト

下記の記事のJQueryコードを元にJavascriptコードを作成しました。 try-m.co.jp

optionに属性を追加する方法は書きを参考にしました。 qiita.com