スキップしてメイン コンテンツに移動

Django extra_views の InlineFormSetFactoryをつかい、dropdown listboxを表示させる

複数の子テーブルが紐づいた詳細編集フォームに、python3-django-extra-views をつかうことで非常に簡単にサブフォームとの連携ができます。しかし、データベースのテーブルを使いまわすため、models.pyでchoicesを指定すると、とある編集場面では問題はないが、ほかの編集場面では異なった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については今のところ方法が見当たらず、かわりに空データの場合 "--------" を表示させるようにしています。
今回は以上です。それでは。

コメント

このブログの人気の投稿

wsdd を使ってSamba サーバをネットワークに表示

Windows 10のアップデートで、セキュリティー対応のため、smbv1がデフォルトではインストールされなくなり、Samba serverがエクスプローラーのネットワークに表示されなくなってしまいました。そこで、いくつか方法を調べたのですが、linuxでwsdの実装がないか探したところ、 https://github.com/christgau/wsdd が、見つかりましたので、さっそくインストールしてみました。まだパッケージにはないようですが、インストール自身は簡単です。wsdd自体は以下のように取得し、linkを張っておきます。 cd /usr/local/bin/ sudo wget https://raw.githubusercontent.com/christgau/wsdd/master/src/wsdd.py sudo chmod 755 wsdd.py sudo ln -sf wsdd.py wsdd こちらのsambaサーバはDebianなので、/etc/systemd/system/wsdd.serviceは以下のようにしました。 [Unit] Description=Web Services Dynamic Discovery host daemon Requires=network-online.target After=network.target network-online.target multi-user.target [Service] Type=simple ExecStart=/usr/local/bin/wsdd -d MYDOMAIN [Install] WantedBy=multi-user.target wsdd -d MYDOMAINのところを、環境にあわせて書き換えてください。 次に、systemdに登録・起動テストを行います。 systemctl enable wsdd systemctl start wsdd 起動に成功すると、エクスプローラーのネットワークに表示されます。  なおこのwsddはpython3が必要です。一度試してみてください。SMBv1/CIFSを停止していても、大丈夫です。 cで書かれたほかのwsddの実装もあるようなので、いずれパッケージになるかもしれませ

Hyper-V Server2019にワークグループ環境下でWindows10(1809)から接続

Hyper-V server 2019に、ワークグループ環境にてWindows10(1809)から接続してみました。Windows10にHyper-V管理ツールがインストールされていることと、Hyper-V Serverをインストール済であることが前提です。以下、Hyper-V serverは名前がHyperVSV、アドレスは192.168.1.110としています。 まず、Hyper-V server上で、powershellを起動し、以下のコマンドを入力します。 Enable-WSManCredSSP -Role Server -Force 続いて、クライアントのWindows10のpowershell で以下のコマンドを入力します。 winrm quickconfig -Force Enable-WSManCredSSP -Role Client -DelegateComputer * -Force さらに、クライアントマシンで、gpedit(グループポリシーエディタ)を起動し、以下の要領でポリシーを設定します。 a. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLMのみのサーバー認証で新しい資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「WSMAN/*」を追加 b. [コンピューターの構成]->[管理テンプレート]->[システム]->[資格情報の委任]->[NTLM のみのサーバー認証で保存された資格情報の委任を許可する] を有効にし、サーバを一覧に追加[表示...]ボタンをクリックして、「*」を追加 また、名前解決できるように、(notepadを管理者権限で実行し)C:\Windows\System32\Drivers\etc\hostsにサーバ名とIPアドレスの対を追加。 192.168.1.110 HyperVSV 最後に、Hyper-Vマネージャーを起動し、Windows10からHyper-V サーバに接続します。手順は以下の通りです。 「サーバーに接続」->コンピュータの選択->別のコンピューターに[HyperVSV]と入力し、[別のユーザーとして接続する

フレッツ光クロス:MAP-E ROUTER by Debian Box (iptables)

フレッツ光クロスがようやく開通したので、Debianにてrouterを構成し接続してみました。なお、プロバイダーを選ぶにあたっては、IPoE方式がそれぞれ異なるため検討したところ、IPoEでは、MAP-Eでもv6plusとocnバーチャルコネクトがあり、前者がポート数240なのに対し、後者は約4倍のポート数が使えるようなネットの情報をみて、OCNバーチャルコネクトを選択しました。(プロバイダーとしてはぷららです。なおDS-LiteはCE側でのNATではないので今回は見送りました。)そこで、OCN バーチャルコネクトをDebian(iptables)で実現するとどうなるかと思い、ネットの情報を頼りにしつつ、設定した次第です。 実際に試した結果、とりあえず通信できていますが、MAP-Eは本来マッピングルールをマップサーバから取得するはずなので、今回のやり方が正解とはいえませんし、仕様変更されると通信できなくなる可能性があります。あくまでも参考程度ですが、本稿をUPしてみました。 2023/03/16追記: こちら にゲームコンソールNAT越え(Nintendo Switch ナットタイプ A判定)対応版を投稿しました。 2023/03/28追記:※1の記述および3行無効化によりNAT越え(Nintendo Switch ナットタイプ B判定)できるようになりました。 構成は以下の通りです。 ルーターがDebianで回線がOCNバーチャルコネクトであること以外はなにも特別なところはない構成です。 さて、いきなり設定ですが、まず、割り当てられたプレフィックスを確認します。 確認は、 dhclient -6 -d -P enp2s0 とします。出力の中に 前略 RCV: | | X-- IAPREFIX 2400:4050:5c71:af00::/56 後略 このようにプレフィックスが表示されるので、その確認したプレフィックスを書き留めておきます。これを こちらで 入力します。すると、 CE: 2400:4050:5c71:af00:99:f171:c600:2f00 IPv4 アドレス: 153.241.113.198 ポート番号:(1776-1791 2800-2815 3824-3839) 4848-4863 5872-5887 6896-