【问题标题】:Same URL in multiple views in DjangoDjango中多个视图中的相同URL
【发布时间】:2014-08-08 22:59:52
【问题描述】:

我正在开发一个网络应用程序,我需要这样的东西:

url(r'^$', 'collection.views.home', name='home'),
url(r'^$', 'collection.views.main', name='main'),

如果用户通过身份验证,则转到 main,否则转到 home。在主页上,不同的是会有一个登录按钮。但这些应该使用相同的 URL 模式。

我该如何处理?

【问题讨论】:

  • 您可以通过中间件处理此重定向。

标签: django url views handle


【解决方案1】:

要处理此类事情,您可以使用单个视图,该视图根据请求状态遵循不同的代码路径。这可能意味着一些简单的事情,比如设置一个上下文变量来激活一个登录按钮,或者像调用不同的函数一样复杂和灵活——例如,你可以编写你的 home 和 main 函数,然后有一个单独的调度视图来调用它们,具体取决于身份验证状态并返回 HTTPResponse 对象。

如果您只需要检查身份验证,您甚至不需要设置上下文变量 - 只需使用 RequestContext 实例,例如使用 render 快捷方式时自动获得的实例。如果您这样做,request 将在上下文中,因此您的模板可以检查诸如 {% if request.user.is_authenticated %} 之类的内容。

一些例子:

def dispatch(request):
    if request.user.is_authenticated:
        return main(request)
    else:
        return home(request)

或者对于更简单的情况:

def home(request):
    if request.user.is_authenticated:
        template = "main.html"
    else:
        template = "home.html"
    return render(request, template)

【讨论】:

    【解决方案2】:

    在研究类似问题时,我发现了一个应用程序 - django-multiurl。它有其局限性,但它非常方便和有用。

    基本上,它允许您在视图中引发ContinueResolving 异常,这将导致处理下一个视图。

    【讨论】:

      【解决方案3】:

      对于可重用的东西,您可以创建一个包含多个视图的父视图并返回第一个返回且没有特定错误的视图。

      class ViewResolver(View):
          views = None
      
          def dispatch(self, request, *args, **kwargs):
             for view in self.views:
                 try:
                     return view(request, *args, **kwargs)
                 except DidNotResolve:
                     continue
      
      
      def view_resolver(*views):
          return ViewResolver.as_view(views=views)
      

      然后在网址中:

      ...
      url("home/", view_resolver(ClassView.as_view(), function_view)),
      ...
      

      请注意这适用于基于类的视图,因为as_view 方法基本上返回基于函数的视图。

      现在,如果您在ClassView 中提出DidNotResolve,它将转到function_view

      【讨论】:

        猜你喜欢
        • 2016-04-26
        • 1970-01-01
        • 2020-10-10
        • 2016-10-26
        • 2018-12-04
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多