3

私は基本的なパーミッションシステムを持っており、に基づいてパーミッションをハードコーディングuser.profile.user_typeしています。これは。user.profileと同等user.get_profile()です。

たとえば、auser_type1(プロパティマネージャー)の場合、そのユーザーはすべての作業指示書を表示できます。(テナント)のAuser_type2、ユーザーが自分で作成した作業指示のみを表示できることを意味します。

私は現在、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、汎用ビューを使用できなくなります。

そして最後に、私の3番目のオプションは、クラスベースのジェネリックビュー内で(どういうわけか)それを制御することです。それが可能かどうかさえわかりません。多分どういうわけ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 に答える