2015-05-28 3 views
1

Это часть моего кода:Как использовать HttpResponseForbidden в этом случае?

def get_queryset(self): 
    if self.request.user.links.filter(pk=self.kwargs['pk']).exists(): 
     return super(View, self).get_queryset() 
    else: 
     return HttpResponseForbidden() 

Я хочу, чтобы проверить, если пользователь посещает свою ссылку и если не вернется HttpResponseForbidden. Мой код работает хорошо с raise PermissionDenied, но, как я прочитал, это плохая практика.

Как сделать мой вид работы с HttpResponseForbidden?

EDIT: Если я использую HttpResponseForbidden() Я ловлю 'HttpResponseForbidden' object has no attribute 'filter'

+1

«Я читал, что это плохая практика» - где? Зачем? Это именно то, для чего. –

+0

@ DanielRoseman http://stackoverflow.com/questions/18574151/django-httpresponseforbidden-not-working – pythad

+0

Вы возвращаетесь, а не поднимаете 'HttpResponseForbidden' из функции' get_queryset'. И тогда где-то вы, вероятно, пытаетесь отфильтровать результаты 'get_queryset', которые затем должны быть экземпляром' QuerySet', но на самом деле является экземпляром 'HttpResponseForbidden'. – Charl

ответ

1

Вы должны сделать все проверки прав доступа в способе доставки.

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

@login_required 
def dispatch(self, request, *args, **kwargs): 
    if not request.user.links.filter(pk=kwargs.get('pk', None)).exists(): 
     return HttpResponseForbidden() 
    return super(View, self).dispatch(request, *args, **kwargs) 
Смежные вопросы