Django Set & Retrieve Session Data - PullRequest
       8

Django Set & Retrieve Session Data

0 голосов
/ 29 марта 2019

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

PS: данные из сеанса будут использоваться для извлечения корзины для пользователя или обновления корзины, если корзина была создана какпосетитель.

Невозможность получить данные сеанса приводит к созданию нового сеанса каждый раз, когда я обновляю браузер.

SETTINGS.PY

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # user apps
    'carts',
    'products',
    'search',
    'tags',

    # 3rd class app
    'bootstrap4',
]

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',
]

ПРИЛОЖЕНИЕ CART

MODELS.PY

from django.conf import settings
from django.db import models

from products.models import Product

User = settings.AUTH_USER_MODEL


class CartManager(models.Manager):
    def new(self, user=None):
        user_obj = None
        if user is not None:
            if user.is_authenticated:
                user_obj = user
        return self.model.objects.create(user=user_obj)

class Cart(models.Model):
    user        = models.ForeignKey(User, null=True, blank=True, on_delete=models.DO_NOTHING)
    products    = models.ManyToManyField(Product, blank=True)
    total       = models.DecimalField(default=0.00, max_digits=100, decimal_places=2)
    timestamp   = models.DateTimeField(auto_now_add=True)
    updated     = models.DateTimeField(auto_now=True)

    objects = CartManager()

    def __str__(self):
        return str(self.id)

VIEWS.PY

from django.shortcuts import render

from .models import Cart


def cart_home(request):
    cart_id = request.session.get('cart_id')
    qs = Cart.objects.filter(id=cart_id)
    print(cart_id, qs)
    # print(dir(request.session))
    if qs.count() == 1:
        print('Cart ID exists')
        cart_obj = qs.first()
        if request.user.is_authenticated and cart_obj.user is None:
            cart_obj.user = request.user
            cart_obj.save()
    else:
        cart_obj = Cart.objects.new(user=request.user)
        request.session['card_id']  = cart_obj.id
        # request.session.modified = True
        # print(dir(request.session))
        # print(request.session.get_expiry_age())
    return render(request, 'carts/home.html', {})

1 Ответ

1 голос
/ 29 марта 2019

Я думаю, что ваша проблема может быть опечаткой в ​​этой строке:

request.session['card_id']  = cart_obj.id

Если вы присмотритесь, вы устанавливаете card_id, но позже пытаетесь получить cart_id.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...