如何在Django中显示已登录用户的不同视图?

时间:2014-04-28 13:29:02

标签: django url

假设我有以下视图ScheduleList,其中用户(已记录或未记录)可以按选定日期查看任务列表,PersonalizedScheduleList用户可以看到所有任务属于他(他必须登录) )。我可以使用一个ListView,并且在get_queryset方法中放大,如果是经过身份验证的用户而不是 - 数据处理不同。

如何在已登录和未登录的用户的同一网址模式上显示不同的视图,以便已记录的用户可以在主页面上看到他的计划列表而不记录可以通过选择当天查看任务?

urlpattern('',
 url(r'^$', views.ScheduleList.as_view()), # not logged user
 url(r'^$', views.PersonalizedScheduleList.as_view()), # logged user
)

2 个答案:

答案 0 :(得分:1)

您需要考虑请求处理和URL路由的控制流。收到请求后,Django会找到与请求的URL匹配的第一个URL模式,并调用分配给该URL的函数(或者在您的情况下,定义了__call__方法的类(CBV实现细节)。这意味着,你不能在一个URL路由级别,只根据标题值分配一个视图而不是另一个视图(认证通常基于某些标题; cookie等),除非URL不同。

解决方案

  1. 编写一种拦截器视图,根据传入请求的登录状态委托另一个视图(这只是一个视图,其get / post方法返回调用您提到的两个视图之一的结果)问题)
  2. 设计应用的工作流程,将用户发送到正确的视图,让每个视图都在不同的URL路径(这是更清晰的处理方式) - 您的页内JavaScript可以处理此客户端,而后端防止意外(或恶意)访问错误视图的尝试

答案 1 :(得分:0)

恕我直言,最佳做法是提供单一视图并执行以下操作:

{% if request.user.is_authenticated %}
.... Authenticated content
{% else %}
.... non-authenticated content
{% endif %}

如果您想要执行2个单独的视图,则需要从/向个性化视图重定向(可能在两个视图中)。