複数の子テーブルが紐づいた詳細編集フォームに、python3-django-extra-views をつかうことで非常に簡単にサブフォームとの連携ができます。しかし、データベースのテーブルを使いまわすため、models.pyでchoicesを指定すると、とある編集場面では問題はないが、ほかの編集場面では異なったchoicesを表示させたい場合がありました。
そこで、いろいろと探してみたのですが、extra_viewsを使ってインラインサブフォーム側でchoicesを指定するのに、これだという記事はみあたりません。ただ、ヒントになる記事はあり、factory_kwargsを指定してフィールドウィジットに細工をすればよさそうだったので、いろいろと試したところできたので、忘備録として挙げてみることにしました。
具体的にいうと、PCパーツのデータベースを作成しようとしているのですが、list表示は無論、たとえばマザーボードの詳細編集フォームとメモリーの詳細編集フォームを分ける必要があります。(マザーボードとメモリーでは属性が異なるためです。たとえば、マザーボードとメモリーには、ベンダー名はあっても、拡張スロットやUSBはメモリーにはありませんし、逆にメモリーの一枚、二枚組の属性はマザーボードにはありません。)
そこで、表題のように、InlineFomrSetFactoryを使いつつも、モデル側ではなく、form側でdropdown listboxのchoicesを個別に指定する必要がある、ということです。前置きが長くなりましたが、コード自体は非常にシンプルです。以下はマザーボードの詳細を入力するためのインラインサブフォームの例です。
今回は以上です。それでは。
そこで、いろいろと探してみたのですが、extra_viewsを使ってインラインサブフォーム側でchoicesを指定するのに、これだという記事はみあたりません。ただ、ヒントになる記事はあり、factory_kwargsを指定してフィールドウィジットに細工をすればよさそうだったので、いろいろと試したところできたので、忘備録として挙げてみることにしました。
具体的にいうと、PCパーツのデータベースを作成しようとしているのですが、list表示は無論、たとえばマザーボードの詳細編集フォームとメモリーの詳細編集フォームを分ける必要があります。(マザーボードとメモリーでは属性が異なるためです。たとえば、マザーボードとメモリーには、ベンダー名はあっても、拡張スロットやUSBはメモリーにはありませんし、逆にメモリーの一枚、二枚組の属性はマザーボードにはありません。)
そこで、表題のように、InlineFomrSetFactoryを使いつつも、モデル側ではなく、form側でdropdown listboxのchoicesを個別に指定する必要がある、ということです。前置きが長くなりましたが、コード自体は非常にシンプルです。以下はマザーボードの詳細を入力するためのインラインサブフォームの例です。
class art_propForm(InlineFormSetFactory): model = art_prop fields = ('prop_cat', 'prop_name', 'prop_dsc1', 'prop_dsc2', 'prop_dsc3', 'prop_dsc4', 'prop_dsc5', ) PROP_CAT_CHOICES = ( ("", '--------'), ('Basic spec', 'Basic spec'), ('Expansion slot', 'Expansion slot'), ('Serial bus', 'Serial bus'), ('Storage', 'Storage'), ('Network', 'Network'), ('On board graphic','On board graphic'), ('On board audio', 'On board audio'), ('Security device', 'Security device'), ('Serial port', 'Serial port'), ) factory_kwargs = { 'widgets' : \ {'prop_cat':\ forms.Select(choices=PROP_CAT_CHOICES), } }今回、新たに追加したのは、PROP_CAT_CHOICESとfactory_kwargsです。たったこれだけですが、対象に合わせてフォームを分ける必要はあるものの、同一データベース・テーブルを使いつつも、それぞれの入力補助が個別にできるようになりました。なお、placeholderについては今のところ方法が見当たらず、かわりに空データの場合 "--------" を表示させるようにしています。
今回は以上です。それでは。
コメント
コメントを投稿