2012-04-08 68 views
3

我有一個基本的權限系統,我基於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

回答

2

如果使用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

相關問題