I'm using PostgreSQL with Django 2.2.
I'm trying to set cart id on the session but every time session gets none value while the user login or not. Even if I tried to open website in incognito mode sessionid cookie is not create with anonymous users. Because of that every time it create a new cart where user is login or not.
views.py
def index(request):
context = {}
res = getCart(request)
context.update(res)
return render(request, 'index.html', context)
def getCart(request):
lines = []
order = {}
cartQuantity = 0
if request.session.get('cart'):
cart = Cart.objects.get(pk=request.session.get('cart'),state='draft')
lines = cart.cartlines_set.all()
cartQuantity = int(cart.getQuantity)
if not order:
cart = Cart.objects.create(customer_id=request.user, state='draft')
request.session['cart'] = cart.id
lines = cart.cartlines_set.all()
cartQuantity = int(cart.getQuantity)
return {'lines': lines, 'cart':cart, 'cartQuantity': cartQuantity}
** url.py **
urlpatterns = [
path('', shop, name="shop"),
]
settings.py
SESSION_SAVE_EVERY_REQUEST = True
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Custom moduels
'cart.apps.cartConfig',
]
It happens because the passing args into the function works in such a way. You're modifying a copy of the request, but the view returns not modified one.
Closest to your case example:
request = "I'm a true request"
def change_request(request):
request = "I want to change request"
return {'foo': 'bar'}
change_request(request)
{'foo': 'bar'}
print(request)
"I'm a true request"
As you can see it's not modified.
Solution Return the same request instance (that you want to modify) as you have got from args. Example:
def view_name(request):
payload = {
# your data
}
request.session['foo'] = 'bar'
return render(request, 'index.html', payload)