from django.core.exceptions import PermissionDenied
# Some class or def...
if (condition):
raise PermissionDenied
Вот как я бы это сделал, просто добавив 403.html в вашу главную папку шаблонов.Преимущество состоит в том, что это может быть помещено куда угодно, даже в унаследованные функции, которые не ожидают объекта ответа.Ниже приведен более реальный пример того, как я его использовал, который отображает пользовательские данные и некоторые сведения о владельце.
from django.views.generic import ListView
from app.models import ExampleModel
class UserProfileDetail(ListView):
model = ExampleModel
template_name = 'auth/user_detail.html'
paginate_by = 10
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
if 'pk' in self.kwargs:
context['username'] = User.objects.get(id=self.kwargs['pk'])
if not self.request.user.is_staff \
and context['username'] != self.request.user:
raise PermissionDenied
else:
context['username'] = self.request.user
return context
def get_queryset(self):
queryset = super().get_queryset()
if 'pk' in self.kwargs:
return queryset.filter(user=self.kwargs['pk'])
else:
return queryset.filter(user=self.request.user).order_by('id')