user_passes_test和Django

时间:2014-01-04 11:58:14

标签: django django-models django-views

我的应用程序中有与特定用户相关的特定主题。如何限制他们只访问他们的科目?

我有想像

一样使用
usersub = get_object_or_404(UserSubject, user=request.user, subject=subject)

如果没有关系,则会抛出404错误。但是有没有其他方法可以使用user_passes_test装饰器来完成它?

1 个答案:

答案 0 :(得分:1)

好吧,你可以使用exists

if UserSubject.objects.filter(user=request.user, subject=subject).exists():
    # what you want to do
else:
    # do something else

或只是filter

usersub = UserSubject.objects.filter(user=request.user, subject=subject)
if usersub:
    # do something
else:
    # do something else

这些会进行检查,但不会引发异常或返回Http404

更新:您必须编写自己的装饰器,因为user_passes_test可以处理您的情况。这是一个示例装饰器:

from django.http import HttpResponseForbidden

def subject_test(f, subject):
    def test_user_for_subject(request, subject, *args, **kwargs):
        if not UserSubject.objects.filter(user=request.user, subject=subject).exists():
            retun HttpResponseForbidden('Access denied!')
        else:
            return f(request, *args, **kwargs)
    return test_user_for_subject

在你的观点中:

@subject_test('your subject here')
def your_view_is_in_here(request):
    ...

但困难的是,除非可以从request

访问,否则必须传递所有过滤器参数