【问题标题】:Django: return several views from a single URL without redirectionDjango:从单个 URL 返回多个视图而无需重定向
【发布时间】:2011-08-30 12:45:27
【问题描述】:

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

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    这相当于您的基于类的视图示例。

    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)
    

    【讨论】:

      【解决方案2】:

      尽管Django docs do say that the function based generic views are now deprecated 我认为切换的唯一原因是您编写的代码更少。

      如果您仍处于切换状态,您需要首先确定哪些基于类的视图或混合是最合适的(单个对象、多个对象、基于日期、表单等)。如果条件用于选择返回不同上下文数据/模板以提供给视图的函数,则可以根据您的用例将条件下推到覆盖的 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 越来越好,但我仍然发现自己在查看源代码以弄清楚如何完成我想要的。

      【讨论】:

        猜你喜欢
        • 2013-04-17
        • 2017-11-19
        • 1970-01-01
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        相关资源
        最近更新 更多