Django中多个视图中的相同URL

时间:2014-06-18 15:10:01

标签: django url views handle

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

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

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

我该如何处理?

3 个答案:

答案 0 :(得分:6)

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

如果您需要检查身份验证,则甚至不需要设置上下文变量 - 只需使用RequestContext实例,例如您使用render时自动获取的实例1}}捷径。如果您这样做,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)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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 方法基本上返回基于函数的视图。

现在,如果您在 DidNotResolve 中加注 ClassView,它将转到 function_view