私は基本的なパーミッションシステムを持っており、に基づいてパーミッションをハードコーディングuser.profile.user_type
しています。これは。user.profile
と同等user.get_profile()
です。
たとえば、auser_type
が1
(プロパティマネージャー)の場合、そのユーザーはすべての作業指示書を表示できます。(テナント)のAuser_type
は2
、ユーザーが自分で作成した作業指示のみを表示できることを意味します。
私は現在、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の概念にはあまり精通していません。
皆さんの提案は何ですか?