我正在开发一个Web应用程序,我需要这样的东西:
url(r'^$', 'collection.views.home', name='home'),
url(r'^$', 'collection.views.main', name='main'),
如果用户已通过身份验证,请转到main,否则请转到主页。在主页上,不同的是按钮中会有一个标志。但这些应该是相同的URL模式。
我该如何处理?
答案 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
。