изменение сеанса запроса в django

#django #django-templates #django-views

#django #django-шаблоны #django-представления

Вопрос:

этот код взят из книги djagno 2 by example, которая, кстати, очень полезна. вопрос здесь в том, как нам удалось изменить сеанс запроса, хотя мы не изменяли его, кроме как в методе сохранения ((( и это в сеансе корзины, который в первой строке после инициализации))) я вижу, что мы сделали копию из словаря сеанса в этой строке
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:

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

 self.session = request.session
  

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

Комментарии:

1. я не имею в виду, что это копия буквально, в любом случае моя путаница заключается в том, что мы создали сеанс корзины в качестве атрибута, поэтому любые изменения будут внесены в сам объект корзины, что не имеет смысла, потому что любое изменение выполняется и в сеансе пользователя

2. Вы все еще говорите так, как будто сеанс корзины и сеанс пользователя — это разные вещи. Они оба ссылаются на один и тот же объект. Я надеюсь, что это поможет.

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