2

それぞれにさまざまなフィールドを持つ 3 つのモデルがあります。2 つのモデルについては、(Django の create_object を介して) 一般的なフォームを使用してデータを要求することに問題はありません。モデル名を受け取り、ユーザーを一般的なフォームに送る関数を書きました

url(r'^add_(?P<modelname>\w+)/$', generic_add),

def generic_add(request, modelname):
    mdlnm_model = models.get_model('catalog',modelname)
    return create_object(request,
        model = mdlnm_model,
        template_name = 'create.html',
        post_save_redirect = '/library/',
        extra_context = {'func': 'Create ' + modelname},
        login_required =  'True'
    )

3 番目のモデルでは、ModelForm クラスを定義して、ユーザーがフォームを見たときにこのモデルのフィールドの 1 つを省略できるようにします。

url(r'^create_actor/$', create_object, Actor_Input, name='db_actor_create'),

Actor_Input = {
   'form_class': ActorForm,
   'template_name': 'create.html',
   'post_save_redirect': '/library/',
   'extra_context': {'func': 'Create Actor'},
   'login_required': 'True'
}

class ActorForm(forms.ModelForm):
    class Meta:
          model = Actor
          fields = ('name','age','height','short_description',
                   'long_description')

Django が定義済みの ModelForm が存在する場合は表示するが、定義済みのフォームが作成されていない場合は完全に一般的なフォームを表示する方法はありますか? もっと多くのモデルを作成する予定であり、Actor のように分割する必要があるすべてのモデルの URL を作成したくありません。

別の言い方をすれば、generic_add 関数を変更して ActorForm (存在する場合) を使用し、それ以外の場合は汎用の ModelForm を使用するようにします。ActorForm クラスの存在を確認する方法はわかっていますが、それも動的にしたい場合はどうすればよいでしょうか? モデル名 + 'フォーム' が存在するかどうかを確認するようなもの。事前定義されたフォームが存在する場合、そのフォームにユーザーを動的に送信する方法がわかりません。

助言がありますか?この問題を見るより良い方法はありますか?

4

2 に答える 2

1

あなたがやろうとしていることに私がおそらくどのようにアプローチするかは次のとおりです。

url(r'^add_(?P<model_name>\w+)/$', generic_add),

model_presets = {
    'Actor': {
        'extra_context': {'func': 'Create Actor'},
        'form_class': ActorForm,
        'login_required': True,
        'post_save_redirect': '/library/',
        'template_name': 'create.html'
    },
    'default': {
        'extra_context': {'func': 'Oops, something went wrong if you are seeing \
                                   this, it should have been overwritten!'},
        'form_class': None,
        'login_required': True,
        'model': None,
        'post_save_redirect': '/library/',
        'template_name': 'create.html'
    }
}

def _create_object_conf_helper(request, model_name):
    if model_name in model_presets:
        conf = model_presets[model_name]
    else:
        try:
            named_model = models.get_model('catalog', model_name)
        except:
            # do something here to protect your app!
        conf = model_presets['default']
        conf['model'] = named_model
        conf['extra_context']['func'] = 'Create %s' % model_name
    conf['request'] = request
    return conf

def generic_add(request, model_name):
    return create_object(**_create_object_conf_helper(request, model_name))

私はこれをテストしていませんが、問題なく動作するはずです。将来的に自分のプロジェクトで同様のものを使用したい場合があるので、そうでない場合はお知らせください。

さらに、これをさらに一歩進めて、model_presets dict に別のレイヤーを作成して、同様のヘルパー関数を使用して、使用している他の汎用ビューの構成を作成できるようにすることもできます。

ところで、True を引用符で囲む必要はありません。Rue ではなく T を大文字にすることを忘れないでください。1 ビットのブール定数に解決されます。「True」を使用すると、文字列として (大まかな) 最小 32 ビットが使用されます。どちらも if ステートメントで true をテストするため、これはそれほど大きな問題ではありません。一方、「False」を使用すると、これもブール値ではなく文字列であるため、期待どおりに機能しないため、true としてテストされます。

http://docs.python.org/library/stdtypes.html#truth-value-testingを参照してください。

于 2010-04-26T08:25:06.380 に答える
0

あなたが話しているこの機能を見ることは非常に役に立ちます。
通常の使用方法は、使用しcreate_objectたいモデルまたはフォームを指定することであり、この場合、3 つの URL になります。

ドキュメントから:

必須の引数:

  • またはが必要ですform_class。 を指定する場合は、サブクラスにする必要があります。モデルのフォームをカスタマイズする必要がある場合は、この引数を使用します。詳細については、ModelForm ドキュメントを参照してください。 それ以外の場合は、Django モデル クラスにする必要があり、使用されるフォームはモデルの標準になります。model
    form_classdjango.forms.ModelForm
    modelModelForm

ご覧のとおり、使用するフォームを指定できます。これはすでに役に立っているかもしれませんが、さらなる情報がなければ、これ以上のことはできません.

于 2010-03-04T07:29:10.130 に答える