3

それぞれが異なるモデルを表す複数の ModelForm クラスがあります。URL パラメータに基づいて指定されたモデル フォームをロードする汎用の「作成」関数が必要です。これでモデルを動的にロードすることが可能です:

model_name = 'TestModel'
m = get_model('AppLabel', model_name)

ModelFormsで同じことを達成する方法を知っている人はいますか?

modelform_name = 'TestModelForm'
f = get_form('AppLabel', modelform_name)
if f.is_valid():
    ...

一般的なビューでこれを行う方法は考えられません。名前だけでなく、ModelForm を渡す必要があります。get_model でモデルを取得し、それをジェネリック ビューに渡すと、フォームが表示されますが、モデル フィールドを除外できません。

ヒントについてはTIA

4

2 に答える 2

2

を作成しModelFormても、モデルのアプリに登録されません。(経験とソースのクイックブラウジングに基づく)。

これが私が考えることができる他のいくつかのオプションです:

  1. すべてのModelFormクラスは単一のモジュールに存在しgetattrます。文字列に基づいてそのモジュールで 使用します。

  2. ModelFormは多くのモデルに分散しており、適度な(<30)量のフォームがあり ます。ModelFormクラスに期待するフォーム文字列から辞書マッピングを作成します。例えば:

    from some_app.forms import FirstModelForm
    from another_app.forms import SecondModelForm
    from additional_app.forms import FirstModelForm as AdditionalAppFirstModelForm # Will allow for managing conflicting names easily.
    
    form_mapping = {
        'FirstModelForm': FirstModelForm,
        'SecondModelForm': SecondForm,
        'AdditionalAppFirstModelForm': AdditionalAppFirstModelForm,
    }
    
    request_form_class = request.POST.get('form_class')
    f = form_mapping.get(request_form_class)(request.POST)
    
    if f.is_valid():
        f.save()
    
  3. 多くのフォームを扱っています。ModelFormのベースクラスを作成するか、BaseModelFormMetaclass実行時に置き換えます。ModelForm名前の競合、同じModel「自動的に」重複するなどの問題に対処する必要があるため、いくつかの頭痛の種に備えてください。あなたがそれをやってのけることができればそれはかなりラッドでしょう。

個人的には(おそらくお分かりのように)、オプション#2を使用します。

于 2010-07-17T02:19:16.223 に答える