изменение сеанса запроса в Django - PullRequest
0 голосов
/ 21 апреля 2019

этот код взят из примера книги 2, что очень кстати.вопрос здесь в том, как нам удалось изменить сеанс запроса, хотя мы не изменили его, кроме как в методе сохранения (((и он находится в сеансе корзины, который в первой строке после init )))я вижу, что мы сделали копию из сессионного словаря в этой строке
self.session = request.session

class Cart(object):
def __init__(self, request):
    self.session = request.session
    cart = self.session.get(settings.CART_SESSION_ID)
    if not cart:
        cart = self.session[settings.CART_SESSION_ID] = {}
    self.cart = cart

def add(self, product, quantity=1, update_quantity=False):
    '''
    Add a product to the cart or update it is quantity
    '''
    product_id = product.id
    if not product_id in self.cart:
        self.cart[product_id] = {'quantity': 0,
                                 'price': str(product.price)}

    if update_quantity:
        self.cart[product_id]['quantity'] = quantity
    else:
        self.cart[product_id]['quantity'] += quantity
    self.save()

def save(self):
    self.session['modified'] = True

, для более подробного объяснения вы можете найти весь код проекта здесь code

Мне удалось увидеть сеанс пользователя, когда я передал его из контекста в шаблон, и он уже изменен

1 Ответ

0 голосов
/ 21 апреля 2019

Эта строка не делает копию:

self.session = request.session

Сеанс в экземпляре Cart - это сеанс запроса. self.cart - это словарь в этом сеансе, поэтому все изменения в нем записываются непосредственно в сеанс. Затем при вызове сохранения устанавливается измененный флаг.

...