Джанго сессии. Перенос последних просмотренных товаров в шаблон
Я хочу сделать функцию показа последних просмотренных товаров через сессии. Проблема в том, что я не могу нормально отфильтровать эти товары. Они идут не по порядку. Я вижу, что все дело в строке recently_viewed_products = Product.objects.filter(slug__in=request.session['recently_viewed'])
, ибо выводя в консоль "оригинальный список"(print(request.session['recently_viewed'])
) работает все так, как мне и нужно.
Я недавно начал изучать сессии и пока не понимаю, как по другому переписать логику работы, чтобы работало все так, как мне нужно.
Вот сам код в views.py
class Detail(DetailView):
model = Product
template_name = 'app/detail.html'
context_object_name = 'product_detail'
slug_url_kwarg = 'product_slug'
def get(self, request, *args, **kwargs):
global recently_viewed_products
recently_viewed_products = None
# request.session['recently_viewed'].clear()
if 'recently_viewed' not in request.session:
request.session['recently_viewed'] = [self.kwargs['product_slug']]
else:
if self.kwargs['product_slug'] in request.session['recently_viewed']:
request.session['recently_viewed'].remove(self.kwargs['product_slug'])
request.session['recently_viewed'].append(self.kwargs['product_slug'])
print(request.session['recently_viewed'])
else:
request.session['recently_viewed'].append(self.kwargs['product_slug'])
print(request.session['recently_viewed'])
recently_viewed_products = Product.objects.filter(slug__in=request.session['recently_viewed'])
print(recently_viewed_products)
request.session.modified = True
return super().get(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
Product.objects.filter(slug=self.kwargs['product_slug']).update(views=F('views') + 1)
context['recently'] = recently_viewed_products
return context
def get_queryset(self):
return Product.objects.filter(draft=False)
В общем решил проблему так. Сначала дополнил модель товара новым полем last_visit = models.TimeField(blank=True, null=True)
. Далее в views.py импортировал datetime(from datetime import datetime
). В контексте вьюхи самого товара прописал обновление поля last_visit - self.object.last_visit = datetime.now() self.object.save()
, что бы время обновлялось при каждом обращении к странице. В recently_viewed_products добавил order_by, в нем сортировку по полю last_visit - recently_viewed_products = Product.objects.filter(slug__in=request.session['recently_viewed']).order_by('last_visit'
)