Задать вопрос
Voskresenskyi
@Voskresenskyi
Начинающий джанговод!

Как вывести значения словаря из списка обьектов сессии Питон/Джанго?

Мне нужно добавить и вывести объекты из сессии таким образом, чтобы потом можно было вывести характеристика выведенных объектов!
Имеется сессия со списком, в котором есть словари -
cart(переменная сессии) [{'price': 436, 'product_id': 5}, {'price': 436, 'product_id': 6}]

добавляю их следующим способом
views.py
def add_product_to_cart(request):
	if request.method == 'POST':
		id = int(request.POST['product_id'])
		price = int(request.POST['price'])
		if 'cart' not in request.session:
			request.session['cart'] = []
		request.session['cart'].append(dict({'product_id': id, 'price': price}))
		request.session.modified = True
		return redirect("/")

и естественно мне нужно вывести значения ключей 'product_id' и 'price' в тепмлейте. Пробую делать это так:
def show_cart(request):
	cart = request.session.get('cart')
	product_items = Product.objects.filter(id__in=cart) #пробовал и так Product.objects.filter(id__in=request.session['cart'])
	content={
		"product_items":product_items
	}
	return render (request, "orderdetail.html", content)


в результате получаю ошибку - int() argument must be a string, a bytes-like object or a number, not 'dict'
Может у кого есть идеи как это реализовать?
изначально делал так:
def add_product_to_cart(request, id):
	if 'cart' not in request.session:
		request.session['cart'] = []
	request.session['cart'].append(int(id))
	request.session.modified = True
	return redirect("/")

def show_cart(request):
	cart = request.session.get('cart') 
	product_items = Product.objects.filter(id__in=cart)
	content={
		"product_items":product_items
	}
	return render (request, "orderdetail.html", content)

получал только id объекта, но в результате получал только наименование товара!! других данных вывести не мог!!
ЗАРАНЕЕ БЛАГОДАРЕН!!
  • Вопрос задан
  • 1146 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@iegor
Замените на id__in=(x['price'] for x in cart)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Voskresenskyi
@Voskresenskyi Автор вопроса
Начинающий джанговод!
Мой ответ таков:
Вариант №1:
views.py
def add_product_to_cart(request):
	if request.method == 'POST':
		id = int(request.POST['product_id'])
		if 'cart' not in request.session:
			request.session['cart'] = []
		request.session['cart'].append(int(id))
		request.session.modified = True
		return redirect("/")

def show_cart(request):
	cart = request.session.get('cart')
	product_items = Product.objects.filter(id__in=cart) #можно и так Product.objects.filter(id__in=request.session['cart'])
	content={
		"product_items":product_items
	}
	return render (request, "orderdetail.html", content)

Вариант №2 (в принципе отличия не серьезные):
def add_product_to_cart(request):
	if request.method == 'POST':
		id = int(request.POST['product_id'])
		price = int(request.POST['price'])
		if 'cart' not in request.session:
			request.session['cart'] = []
		request.session['cart'].append(dict({'product_id': id, 'price': price}))
		request.session.modified = True
		return redirect("/")

def show_cart(request):
	cart = request.session.get('cart')
	product_items = Product.objects.filter(id__in=(x['product_id'] for x in cart) )#можно прописать и для price вот только фактически это не нужно...
	content={
		"product_items":product_items
	}
	return render (request, "orderdetail.html", content)


В добавок - читайте свой код! В данном случае я в темплейте пропустил(скорее всего нечаянно удалил) скобку))
Спасибо iegor за помощь,)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Strikt Москва
от 100 000 до 180 000 ₽
ITK academy Саратов
от 75 000 ₽
Sim-Ba Pay Санкт-Петербург
от 180 000 ₽