web-dev-qa-db-ja.com

Django is_staffパーミッションデコレータ

2つのユーザーレベルを使用してページへのアクセスを制限しようとしています。スーパーユーザーと管理者。スーパーユーザーは、通常のDjango「is_superuser」が割り当てられたユーザーです。管理ユーザーも、「is_staff」権限のみが割り当てられた通常のユーザーです。

問題は、管理ユーザーにこのデコレータを使用すると、テストに合格しないことです。

_@permission_required('is_staff')
def my_view(....)
_

@permission_required('is_staff')は、匿名ユーザーに対してfalseを返します。 (正しい)
@permission_required('is_superuser')は、スーパーユーザーに対してのみtrueを返します(正しい)
@permission_required('is_staff')は、「is_staff」パーマが割り当てられているユーザーに対してFALSEを返します。 (違う)。

何かご意見は?

51
Dim

is_staffは許可ではないので、代わりにpermission_required使用できます:

@user_passes_test(lambda u: u.is_staff)

または

from Django.contrib.admin.views.decorators import staff_member_required

@staff_member_required
104
arie

クラスベースのビューの場合、 serPassesTestMixin が便利です。

class ImportFilePostView(LoginRequiredMixin, UserPassesTestMixin):
  def test_func(self):
    return self.request.user.is_staff
  ...
7
shadi

クラスベースビューの場合は、permission_required('is_staff')urls.pyに追加できます。

from Django.contrib.auth.decorators import permission_required

url(r'^your-url$', permission_required('is_staff')(YourView.as_view()), name='my-view'),
7