Django:从单个URL返回多个视图而不重定向

时间:2011-05-22 09:21:18

标签: django django-views django-class-based-views

使用基于功能的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/")

有什么建议吗?

2 个答案:

答案 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正在变得越来越好,但我仍然发现自己正在寻找如何实现我想要的源代码。