Контекст должен быть диктой, а не типом
Я работаю над проектом некоторое время, и у меня есть ресурс под названием 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