Невозможно получить значение по ключу из request.session; Я использую джанго - PullRequest
2 голосов
/ 08 июня 2019

Я пытаюсь сделать интернет-магазин с Django.Но у меня есть некоторые проблемы.Во время создания корзины я получаю сообщение об ошибке "локальная переменная" cart_id ", на которую ссылается перед назначением" в views.py.Вот этот файл:

def cart_view(request):
    try:
        cart_id = request.session['cart_id']
        cart = Cart.objects.get(id=cart_id)
        request.session['total'] = cart.items.count()
    except:
        cart = Cart()
        cart.save()
        cart_id = cart_id
        request.session['cart_id'] = cart_id
        cart = Cart.objects.get(id=cart_id)

    categories = Category.objects.all()
    return render(request, 'cart.html', locals()) 

Вот трассировка

Traceback:

File "C:\Users\tankr\Django_projects\django_shop\ecomapp\views.py" in product_view
  13.       cart_id = request.session['cart_id']

File "C:\Users\tankr\Django_projects\django_shop\eComEnv\lib\site-packages\django\contrib\sessions\backends\base.py" in __getitem__
  54.         return self._session[key]

During handling of the above exception ('cart_id'), another exception occurred:

File "C:\Users\tankr\Django_projects\django_shop\eComEnv\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\tankr\Django_projects\django_shop\eComEnv\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\tankr\Django_projects\django_shop\eComEnv\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\tankr\Django_projects\django_shop\ecomapp\views.py" in product_view
  19.       cart_id = cart_id

Exception Type: UnboundLocalError at /product/macbook-pro/
Exception Value: local variable 'cart_id' referenced before assignment

Затем я попытался решить эту проблему, добавив global cart_id к функции cart_view и получил еще одну ошибку: name 'cart_id'не определено.Вот новая трассировка:

Traceback:

File "C:\Users\tankr\Django_projects\django_shop_2\ecomapp\views.py" in product_view
  14.       cart_id = request.session['cart_id']

File "C:\Users\tankr\Django_projects\django_shop_2\eComEnv\lib\site-packages\django\contrib\sessions\backends\base.py" in __getitem__
  54.         return self._session[key]

During handling of the above exception ('cart_id'), another exception occurred:

File "C:\Users\tankr\Django_projects\django_shop_2\eComEnv\lib\site-packages\django\core\handlers\exception.py" in inner
  34.             response = get_response(request)

File "C:\Users\tankr\Django_projects\django_shop_2\eComEnv\lib\site-packages\django\core\handlers\base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\tankr\Django_projects\django_shop_2\eComEnv\lib\site-packages\django\core\handlers\base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\tankr\Django_projects\django_shop_2\ecomapp\views.py" in product_view
  20.       cart_id = cart_id

Exception Type: NameError at /product/iphone-xr-128gb/
Exception Value: name 'cart_id' is not defined

Ответы [ 2 ]

2 голосов
/ 08 июня 2019

Линия cart_id = cart_id не имеет смысла, вы хотите использовать cart.id Я думаю, или даже безопаснее cart.pk:

def cart_view(request):
    try:
        cart_id = request.session['cart_id']
        cart = Cart.objects.get(id=cart_id)
    except (KeyError, Cart.DoesNotExist):
        cart = Cart.objects.create()
        request.session['cart_id'] = cart_id = <b>cart.pk</b>
        request.session['total'] = 0
    else:
        request.session['total'] = cart.items.count()
    categories = Category.objects.all()
    return render(request, 'cart.html', locals())

Пожалуйста, не не используйте locals() однако.С точки зрения разработки программного обеспечения, это не очень хорошая практика.Это означает, что вы не знаете, что передаете в шаблон.Если вы случайно создадите переменную, имя которой совпадает с именем переменной, из контекстного процессора, вы можете получить непреднамеренное поведение.

0 голосов
/ 08 июня 2019

Проблема в том, что ваш блок try не выполняется, кроме блока начала выполнения, где присутствует cart_id = cart_id, и именно поэтому вы получаете ошибку.

вы можете сделать что-то подобное в существующем коде

def cart_view(request):
    cart_id = request.session['cart_id']                     # before try block
    try:
        cart = Cart.objects.get(id=cart_id)
        request.session['total'] = cart.items.count()
    except:
        cart = Cart()
        cart.save()
        cart_id = cart_id
        request.session['cart_id'] = cart_id
        cart = Cart.objects.get(id=cart_id)

    categories = Category.objects.all()
    return render(request, 'cart.html', locals())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...