在哪里可以控制Django中的权限式查看?在URL(通过通用视图),模板或视图?
我有一个基本的权限系统,我基于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
?我真的很喜欢通用视图的简单性,但我不太熟悉更先进的面向对象的概念。
你们的建议是什么?
如果使用ListView
有get_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)
感谢您的回应!一个简单的问题:如果我想获得总的'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
是的,你必须这样做。大多数人认为这是CBV的缺点,因为你需要编写很多垃圾代码。但另一方面,CBV允许您在关卡(queryset,context_data,dispatch等)上分割您的类,并且可以将其用作其他View类中的Mixins – San4ez 2012-04-08 20:29:44
有什么特别的原因可以说明您为什么使用'get_queryset '反对简单地定义'queryset = ...'?是不是因为没有进入'get_queryset'函数而无法获取'request.user'信息?我只是定义'queryset = ...',但我不知道如何获取用户信息。 – hobbes3 2012-04-09 08:08:51
为什么不扩展一般的视图类并添加自己的逻辑是什么? – Dor 2012-04-08 10:31:56