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 文档确实说基于函数的通用视图现在已被弃用,但我认为切换的唯一原因是您编写的代码更少。

如果您仍处于切换状态,您将需要首先确定哪些基于类的视图或 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)并在那里切换到适当的方法。详细的文档越来越好,但我仍然发现自己正在浏览源代码以弄清楚如何完成我想要的。

于 2011-05-22T09:57:26.767 回答