Как ограничить представление только суперпользователем?
view.py
@login_required
@permission_required('is_superuser')
def score_reset(request):
pass
url.py
url(r'^score-reset/$', score_reset, name='score-reset'),
У меня есть следующий код, и, к моему удивлению, я все еще попадал в функцию, несмотря на то, что я вошел в систему с помощью не суперпользователя. Я ожидал получить разрешение на отказ.
Что мне не хватает?
Ответы
Ответ 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)