2015-11-09 2 views
0

Я вижу, что на сайтах электронной коммерции посетители могут добавлять товары в корзину, но во время проверки он может войти в систему и продолжить покупки без потери переменных сеанса. Например, я добавляю два элемента в корзину, а затем я вхожу в систему и добавляю третий элемент. Я предполагаю, что это можно сделать с помощью сеанса, так что я сделал следующее представление для добавления в корзину:Как подключить переменные сеанса к зарегистрированному пользователю в Django?

def AddToBag(request, upc): 
    if request.method == "GET": 
     item = Item.objects.get(upc=upc) 
     amount = 1 
     price = Item.objects.filter(id=item.id).values('mrp')[0]['mrp'] 
     net = amount * price 
     session_id = request.session.session_key 
     if request.user.is_authenticated(): 
      b, created = Bag.objects.get_or_create(user=request.user, upc=upc, defaults={'item': item, 'qty': amount, 'price': price, 'net': net, 'session_id': session_id}) 
      if created: 
       pass 
      else: 
       amount = Bag.objects.filter(user=request.user, upc=upc).values('qty')[0]['qty'] + 1 
       net = amount * price 
       Bag.objects.filter(upc=upc).update(qty=amount, net=net) 
      total_items = Bag.objects.filter(user=request.user).count() 
      total_price = Bag.objects.filter(user=request.user).aggregate(Sum('net'))['net__sum'] 
     else: 
      b, created = Bag.objects.get_or_create(user=User.objects.get(username='AnonymousUser'), upc=upc, defaults={'item': item, 'qty': amount, 'price': price, 'net': net, 'session_id': session_id}) 
      if created: 
       pass 
      else: 
       amount = Bag.objects.filter(user=User.objects.get(username='AnonymousUser'), upc=upc).values('qty')[0]['qty'] + 1 
       net = amount * price 
       Bag.objects.filter(upc=upc).update(qty=amount, net=net) 
      total_items = Bag.objects.filter(user=User.objects.get(username='AnonymousUser')).count() 
      total_price = Bag.objects.filter(user=User.objects.get(username='AnonymousUser')).aggregate(Sum('net'))['net__sum'] 
    return render(request, "alpha/add-to-bag.html", {'total_items': total_items, 'total_price': total_price}) 

То, что я заметил, что если я просматриваю, как AnonymousUser добавления элементов в корзину не сохранить session_key, поэтому, когда я войдите в систему, все предметы исчезли, и я снова должен начинать добавлять элементы. Если я снова выйду из системы, элементы, добавленные до входа в систему, все еще существуют.

Что я хочу, так это то, что пользователи могут добавлять элементы в корзину, а анонимные, если они решат войти в систему, эти элементы будут переданы в корзину после входа в систему. Если они снова выйдут из системы и станут анонимными посетителями, они могут потерять когда они были перенесены в корзину пользователя. Как я могу это сделать?

Обновление: Я смог создать идентификатор сеанса перед входом пользователя и сохранить его в поле session_id. Однако идентификаторы сеансов различаются до и после входа в систему, как приложение может понять, является ли он одним и тем же пользователем?

ответ

0

Вы должны уловить момент, когда пользователь входит в систему и копирует корзину в новый сеанс. Например, создайте собственное окно входа в систему, сохраните корзину с сеанса до аутентификации и скопируйте ее в новый сеанс после аутентификации.

Другой подход - сохранить корзину (или идентификатор корзины) в пользовательских файлах cookie.

Смежные вопросы