我有一個基本的權限系統,我基於user.profile.user_type
幾乎硬編碼權限,其中user.profile
相當於user.get_profile()
。在哪裏可以控制Django中的權限式查看?在URL(通過通用視圖),模板或視圖?
例如,如果user_type
是1
(物業經理),那麼該用戶可以查看所有工單。 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
?我真的很喜歡通用視圖的簡單性,但我不太熟悉更先進的面向對象的概念。
你們的建議是什麼?
爲什麼不擴展一般的視圖類並添加自己的邏輯是什麼? – Dor 2012-04-08 10:31:56