使用基于功能的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/")
有什么建议吗?
答案 0 :(得分:6)
这相当于基于类视图的示例。
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)
答案 1 :(得分:1)
尽管Django docs do say that the function based generic views are now deprecated我认为切换的唯一原因是你编写的代码较少。
如果您仍然设置切换,则需要首先确定哪个基于类的视图或mixin最合适(单个对象,多个对象,基于日期,表单等)。如果条件用于选择返回不同上下文数据/模板以提供给视图的函数,则可以根据用例将条件向下推送到被覆盖的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)
并将其切换到适当的方法。 detailed docs正在变得越来越好,但我仍然发现自己正在寻找如何实现我想要的源代码。