2

ジェネリック クラス ビューアーを使用して、同じテンプレートを使用して、django のさまざまなモデルのレコードを表示したいと考えています。ジェネリック クラス ビューアは、1 つを除いて、テンプレートで必要なほとんどの引数を既に受け入れています。

コンテキスト内のこの追加の引数をテンプレートに渡すにはどうすればよいですか?

urlconf の 3 番目の (追加の) 引数として渡そうとしましたが、成功しませんでした:

# in urlconf.py
url(r'^processador/(?P<pk>[\w-]+)/$',
    UpdateView.as_view(
        model=Processador,
        template_name='model_form.html',
        success_url=reverse_lazy('processador-list'),
        ),
    {'extrainfo': "Processador"},
    name='processador-detail'
),

url(r'^software/(?P<pk>[\w-]+)/$',
    UpdateView.as_view(
        model=Software,
        template_name='model_form.html',
        success_url=reverse_lazy('software-list'),
        ),
    {'extrainfo': "Software"},
    name='software-detail'
),

私のアプリケーションには、このような urlconf がいくつかあります。

1 つの可能性は、ビュー クラスをサブクラス化し、目的のキーと値のペアを追加する get_context_data メソッドの独自の実装を提供することです。

しかし、このソリューションは、ビュー クラスのすべての使用に適用されるため、繰り返しが多すぎます。

ビュー クラスのサブクラスを 1 つだけ作成することも可能です。この新しいクラスの as_view クラス メソッドは、get_context_data の再定義でコンテキストに入る新しい名前付き引数を受け入れます。

私は django と Python の経験があまりないので、これを達成する方法がわからず、助けを受け入れています。

4

2 に答える 2

4

UpdateViewこれは、必要だと思うモデルごとに1つではなく、の1つのサブクラスだけで実行できると思います。

返されるオブジェクトの属性として設定される引数as_viewなので、できると思います

class MyUpdateView(UpdateView):
    extrainfo = None

    def get_context_data(self, **kwargs):
        context = super(MyUpdateView, self).get_context_data(self, **kwargs)
        context['extrainfo'] = self.extrainfo

        return context

そして、これをあなたのurlconfで次のように呼びます

url(r'^processador/(?P<pk>[\w-]+)/$',
    MyUpdateView.as_view(
        model=Processador,
        template_name='model_form.html',
        success_url=reverse_lazy('processador-list'),
        extrainfo="Processador"
        ),
    name='processador-detail'
)

しかし、あなたがこれを行うべきかどうかはまったくわかりません-それはであまりにも多くのものに向かっていurls.pyます。

于 2012-08-03T22:06:56.743 に答える
2

次のように、汎用ビューをサブクラス化することでそれを行ってきました。

urls.py

url(r'^processador/(?P<pk>[\w-]+)/$', ProcessadorUpdateView.as_view(), name='processador-detail'),
url(r'^software/(?P<pk>[\w-]+)/$', SoftwareUpdateView.as_view(), name='software-detail'),

そしてでviews.py

class ProcessadorUpdateView(UpdateView):
    model=Processador
    template_name='model_form.html'
    success_url=reverse_lazy('processador-list') # I'm not sure this will work; I've used get_success_url method
    def get_context_data(self, **context):
        context[self.context_object_name] = self.object
        context["extrainfo"] = "Processador"
        return context

実際、追加の機能が必要ない場合でも、常に独自のサブクラスを作成しています。このようにして、より多くの制御が可能になり、ビューと urlconfig が明確に分離されます。

于 2012-07-21T21:27:19.717 に答える