Контекст должен быть диктой, а не типом

Я работаю над проектом некоторое время, и у меня есть ресурс под названием Item.

Просмотр детализации товара возможен только в том случае, если товар принадлежит той же компании, что и пользователь. Если нет, то должно быть 404. Вот код, который у меня есть:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)

    # To only show items in your company
    if (context['item'].company != getCompany(self.request.user)):
        return HttpResponseNotFound

    return context

getCompany - это функция, которую я написал для проверки компании пользователя. Компания находится в пользовательской модели Profile. Эта функция работает, я уже использовал ее несколько раз для других вещей

Теперь я ожидал получить 404 при переходе к товару из другой компании, но вместо этого появляется эта ошибка:

    Internal Server Error: /fr/items/5/
Traceback (most recent call last):
  File "/Users/username/Documents/Work/Inventory/inventory-env/lib/python3.9/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
  File "/Users/username/Documents/Work/Inventory/inventory-env/lib/python3.9/site-packages/django/core/handlers/base.py", line 220, in _get_response
    response = response.render()
  File "/Users/username/Documents/Work/Inventory/inventory-env/lib/python3.9/site-packages/django/template/response.py", line 114, in render
    self.content = self.rendered_content
  File "/Users/username/Documents/Work/Inventory/inventory-env/lib/python3.9/site-packages/django/template/response.py", line 92, in rendered_content
    return template.render(context, self._request)
  File "/Users/username/Documents/Work/Inventory/inventory-env/lib/python3.9/site-packages/django/template/backends/django.py", line 58, in render
    context = make_context(
  File "/Users/username/Documents/Work/Inventory/inventory-env/lib/python3.9/site-packages/django/template/context.py", line 278, in make_context
    raise TypeError(
TypeError: context must be a dict rather than type.

Редактировано:

Что я пропустил?

as Django doc

def get_context_data(self, **kwargs):

используется для

Возвращает словарь, представляющий контекст шаблона. Ключевое слово будут составлять возвращаемый контекст

.

и вы пытаетесь вернуть HttpResponseNotFound, это не сработает, вы должны вернуть dict type

Метод get_context_data(...) должен возвращать объект dict. В вашем случае вы возвращаете HttpResponseNotFound, что неправильно.

Простой способ поднять ошибку 404 - использовать класс Http404 для поднятия исключения

from django.http import Http404


def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)

    # To only show items in your company
    if (context['item'].company != getCompany(self.request.user)):
        raise Http404

    return context

Лучше поднять ошибку PermissionDenied, затем вернуть Response неправильно в качестве контекста, это дает лучший смысл, тогда Django вернет обычную 403 страницу.

from django.core.exceptions import PermissionDenied

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    # To only show items in your company
    if (context['item'].company != getCompany(self.request.user)):
        raise PermissionDenied("You are not authorized to view the requested company")
    return context
Вернуться на верх