3

我有一个基本权限系统,我在其中几乎基于 对权限进行硬编码user.profile.user_typeuser.profile相当于user.get_profile().

例如,如果 auser_type1(物业经理),那么该用户可以查看所有工作订单。A user_typeof 2(tenant) 表示用户只能查看他创建的工单。

我目前只是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?我真的很喜欢通用视图的简单性,但我对更高级的 OO 概念不太熟悉。

各位有什么建议?

4

1 回答 1

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)
于 2012-04-08T08:58:46.607 回答