#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. ооо, извините, это проблема, я не понимал, что когда мы присваиваем новую переменную другой, если мы вносим изменения в последнюю, первая тоже будет изменена, я хочу поблагодарить вас, вы мне очень помогли