Подтвердить что ты не робот

Как ограничить представление только суперпользователем?

view.py

@login_required
@permission_required('is_superuser')
def score_reset(request):
   pass

url.py

url(r'^score-reset/$', score_reset, name='score-reset'),    

У меня есть следующий код, и, к моему удивлению, я все еще попадал в функцию, несмотря на то, что я вошел в систему с помощью не суперпользователя. Я ожидал получить разрешение на отказ.

Что мне не хватает?

4b9b3361

Ответ 1

is_superuser не является разрешением, это атрибут в пользовательской модели. Для выполнения этой проверки Django уже имеет еще один декоратор, который вы можете использовать с именем user_passes_test:

from django.contrib.auth.decorators import user_passes_test

@user_passes_test(lambda u: u.is_superuser)
def score_reset(self,...):
    ...

Ответ 2

@user_passes_test не является изящным решением, если вы хотите выполнить эту проверку во многих представлениях. Вы можете легко написать свой собственный декоратор, например, @staff_member_require.

Здесь вы можете увидеть одно из возможных решений.

Ответ 3

Выше ответы, кажется, для ранних версий django. Они немного сложнее, чем для более поздней версии

для django 1.11 здесь немного похожая, но более простая стратегия.

views.py

from django.contrib.auth.decorators import login_required

@login_required
def some_view(request):
if request.user.is_superuser:
    //allow access only to superuser
    return render(request, 'app/template1.html', args)
else:
    //allow access only to user
    return render(request, 'app/template2.html', args)