在哪里可以控制Django中的权限式查看?在URL(通过通用视图),模板或视图?

问题描述:

我有一个基本的权限系统,我基于user.profile.user_type几乎硬编码权限,其中user.profile相当于user.get_profile()在哪里可以控制Django中的权限式查看?在URL(通过通用视图),模板或视图?

例如,如果user_type1(物业经理),那么该用户可以查看所有工单。 2(承租人)的user_type表示用户只能查看他创建的工单。

我目前只需使用基于类的通用视图在urls.py这样

url(
    r'^orders/$', 
    ListView.as_view(
     model = Order, 
     template_name = 'doors/orders/list.html' 
    ), 
    name = 'orders_list' 
), 

,所以我没有权限控制的。

所以要添加权限系统,我应该在模板中控制它吗?

{% for order in order_list %} 
    {% if request.user.profile.user_type == 1 %} 
     # Show every order 
     {{ order.pk }} 
    {% else %} 
     # Show only work orders created by that user 
     {% if order.creator == request.user.pk %} 
      {{ order.pk }} 
     {% endif %} 
    {% endif %} 
{% endfor %} 

我有一种感觉,试图过滤在模板中是很多的SQL打的浪费,因为不管user_type是什么,模板仍会强制的Django调用每个工作秩序。真的吗?

或者我应该像这样在视图中控制它?

def orders_list(request) : 
    if request.user.user_type == 1 : 
     order_list = Order.objects.all() 
    else : 
     order_list = Order.objects.filter(creator = request.user.pk) 

    dictionary = { 
     'order_list' : order_list, 
    } 

    return render(request, 'doors/orders/list.html', dictionary) 

很显然,如果我试图去控制它里面views.py,那么我就可以不再使用通用视图。

最后我的第三个选择是(以某种方式)在基于类的通用视图内控制它。我甚至不知道这是否可能。可能以某种方式与get_context_data?我真的很喜欢通用视图的简单性,但我不太熟悉更先进的面向对象的概念。

你们的建议是什么?

+0

为什么不扩展一般的视图类并添加自己的逻辑是什么? – Dor 2012-04-08 10:31:56

如果使用ListViewget_queryset()的方法来做到这一点:

class OrderListView(ListView): 
    template_name = 'doors/orders/list.html' 

    def get_queryset(self): 
     user = self.request.user 
     if user.user_type == 1: 
      return Order.objects.all() 
     return Order.objects.filter(creator=user.pk) 
+0

感谢您的回应!一个简单的问题:如果我想获得总的'Order'计数而不考虑权限(有点像Stack Overflow的统计:2,904,397个问题),我*是否将它作为[extra context]发送(https:// docs.djangoproject.com/en/1.4/topics/class-based-views/#adding-extra-context)?看起来像很多代码只是发送一个额外的变量到模板。 – hobbes3 2012-04-08 20:07:48

+1

是的,你必须这样做。大多数人认为这是CBV的缺点,因为你需要编写很多垃圾代码。但另一方面,CBV允许您在关卡(queryset,context_data,dispatch等)上分割您的类,并且可以将其用作其他View类中的Mixins – San4ez 2012-04-08 20:29:44

+0

有什么特别的原因可以说明您为什么使用'get_queryset '反对简单地定义'queryset = ...'?是不是因为没有进入'get_queryset'函数而无法获取'request.user'信息?我只是定义'queryset = ...',但我不知道如何获取用户信息。 – hobbes3 2012-04-09 08:08:51