3

関数ベースの Django ビューを使用すると、条件に基づいていくつかの異なるビューを簡単に切り替えることができました。たとえば、次のようになります。

def base_view(request):
    if some_condition():
        return foo_view(request)
    else:
        return bar_view(request)

新しいクラスベースの汎用ビューで同じことを行う簡単な方法が見つかりません。私が考えることができる唯一の方法は、さまざまな理由で避けたいリダイレクトです。

def base_view(request):
    if some_condition():
        return redirect(reverse("name_of_url_to_class-based_view_foo"))
    else:
        return redirect("/url_to_class-based_view_bar/")

助言がありますか?

4

2 に答える 2

7

これは、クラスベースのビューを使用した例と同等です。

class FooView(View):
    pass

class BarView(View):
    pass

class BaseView(View):
    # staticmethod to avoid adding 'self' to the arguments
    foo_view = staticmethod(FooView.as_view())
    bar_view = staticmethod(BarView.as_view())

    def dispatch(self, request, *args, **kwargs):
        if some_condition():
            return self.foo_view(request, *args, **kwargs)
        else:
            return self.bar_view(request, *args, **kwargs)
于 2011-05-22T10:10:23.520 に答える
1

Djangoのドキュメントには、関数ベースの汎用ビューは非推奨になっていると書かれていますが、切り替える理由は、記述しているコードが少ない場合だけだと思います。

それでも切り替えを設定している場合は、最初に、どのクラスベースのビューまたはミックスインが最も適切かを特定する必要があります(単一オブジェクト、複数オブジェクト、日付ベース、フォームなど)。条件を使用して、ビューに提供するさまざまなコンテキストデータ/テンプレートを返す関数を選択した場合get_queryset|get_context_data|get_object|get_template_namesは、ユースケースに応じて条件をオーバーライドにプッシュできます。

例えば、

def get_context_data(self, **kwargs):
    # Call the base implementation first to get a context
    context = super(BaseView, self).get_context_data(**kwargs)
    # Add in the publisher
    if some_condition():
        context['some_data'] = ...
    else:
        context['other_data'] = ...
    return context

他のすべてが失敗し、それでもクラスベースのビューがあると判断された場合は、オーバーライド get(self, request, *args, **kwargs)して、適切なメソッドに切り替えることもできます。詳細なドキュメントは改善されていますが、私はまだソースコードを調べて、自分が望むことを達成する方法を見つけています。

于 2011-05-22T09:57:26.767 に答える