1

urls.py でループして同じ関数ベースのジェネリック ビューを指していたシンプルなジェネリック ビューを利用するビューが非常にたくさんあります。クラス ベースのジェネリック ビューに移行したので、この機能を複製する必要があり、次のように、すべてのロジックを urls.py ファイルに移動する必要があります。

GENERIC_VIEWS_EDIT = ['ModelOne', 'ModelTwo', 'ModelThree', 'ModelFour', 'ModelN',]

for model in GENERIC_VIEWS_EDIT:
    urlpatterns += patterns('',

        url(r'^%s/(?P<pk>\d+)/$' % model.lower(), never_cache(staff_member_required(UpdateView.as_view(
            model=eval(model),
            context_object_name='object',
            form_class=eval('%sForm' % model),
            template_name='edit_form.html',
            success_url='/yay/'
        ))), name='edit-%s' % model.lower()),

    )

これは問題なく動作しますが、urls.py ファイルにこの「ビュー コード」がすべて含まれているのは嫌です。さらに、これらの N 個のモデルのうちの 1 つまたは 2 つのメソッドをオーバーライドする必要がある場合、この実装ではそれが不可能になります。

モデルを引数として渡し、ジェネリック ビューを views.py に戻す方法はありますか?

GENERIC_VIEWS_EDIT = ['ModelOne', 'ModelTwo', 'ModelThree', 'ModelFour', 'ModelN',]

for model in GENERIC_VIEWS_EDIT:
    urlpatterns += patterns('',
        url(r'^%s/(?P<pk>\d+)/$' % model.lower(), UpdateView.as_view(model=model)), name='edit-%s' % model.lower()),
    )
4

1 に答える 1

1

あなたが正しい。このロジックはビューに属します。

クラスベースのビューを使用しているため、UpdateView をサブクラス化__init__()し、カスタム ロジックで関数をオーバーライドできます。

class MyUpdateView(UpdateView):
    template_name = 'edit_form.html'
    success_url = '/yay/'
    context_object_name = 'object'

    def __init__(self, *args, **kwargs):
        super(MyUpdateView, self).__init__(*args, **kwargs)
        self.form_class = eval('%sForm' % self.model)
于 2013-03-28T20:49:40.643 に答える