我正在使用 django 框架开发一个项目。
我在 html 上显示用户(登录)之前点击过的最近查看的项目时遇到问题。
这是我的index.html,显示最近查看的项目
<div class="mt-6 px-6 py-12 bg-gray-100 rounded-xl">
<h2 class="mb-12 text-2xl text-center">Recently Viewed Items</h2>
<div class="grid grid-cols-3 gap-3">
{% if recently_viewed_qs %}
{% for item in recently_viewed_qs %}
<div>
<a href="{% url 'item:detail' item.id %}">
<div>
<img src="{{ item.image.url }}" class="rounded-t-xl">
</div>
<div class="p-6 bg-white rounded-b-xl">
<h2 class="text-2xl">{{ item.name }}</h2>
</div>
</a>
</div>
{% endfor %}
{% else %}
<p>No recently viewed items.</p>
{% endif %}
</div>
</div>
我得到的是响应没有最近查看的项目,所以我猜没有进入for循环
这是我的views.py(不是所有观点,而是理解问题的基本观点)
def items(request):
query = request.GET.get('query', '')
category_id = request.GET.get('category', 0)
categories = Category.objects.all()
items = Item.objects.filter()
if category_id:
items = items.filter(category_id=category_id)
if query:
items = items.filter(Q(name__icontains=query) | Q(description__icontains=query))
print(f'Session Data: {request.session.get("recently_viewed", [])}')
return render(request, 'item/items.html', {
'items': items,
'query': query,
'categories': categories,
'category_id': int(category_id)
})
def recently_viewed( request, pk ):
print('Entered in the recently_viewed')
if not "recently_viewed" in request.session:
request.session["recently_viewed"] = []
request.session["recently_viewed"].append(pk)
else:
if pk in request.session["recently_viewed"]:
request.session["recently_viewed"].remove(pk)
request.session["recently_viewed"].insert(0, pk)
if len(request.session["recently_viewed"]) > 5:
request.session["recently_viewed"].pop()
request.session.modified =True
def detail(request, pk):
item = get_object_or_404(Item, pk=pk)
related_items = Item.objects.filter(category=item.category).exclude(pk=pk)[:3]
ratings = Rating.objects.filter(item=item)
recently_viewed(request,pk)
print(Item.pk)
recently_viewed_qs = Item.objects.filter(pk__in=request.session.get("recently_viewed", []))[:3]
#recently_viewed = request.session.get('recently_viewed',[])
#if pk not in recently_viewed:
# recently_viewed.append(pk)
#recently_viewed = recently_viewed[-3:]
#request.session['recently_viewed'] = recently_viewed
#print(request.session['recently_viewed'])
#recently_items = Item.objects.filter(id__in=recently_viewed)
#print(f'recently_items{recently_items}')
if ratings:
average_rating = round(sum(rating.value for rating in ratings) / len(ratings), 2)
else:
average_rating = None
user_rating = Rating.objects.filter(item=item, rated_by=request.user).first()
if request.method == 'POST':
print('Entered in the POST method')
rating_form=RatingForm(request.POST)
if rating_form.is_valid():
rating = rating_form.save(commit=False)
rating.item = item
rating.rated_by = request.user
form_submitted = True
rating.save()
else:
rating_form = RatingForm()
form_submitted = False
print(f'recently viewed qs {recently_viewed_qs}')
return render(request, 'item/detail.html', {
'item': item,
'related_items': related_items,
'ratings': ratings,
'average_rating': average_rating,
'rating_form': rating_form,
'recently_viewed': recently_viewed_qs,
#'recently_items': recently_items,
'user_rating':user_rating,
'form_submitted': form_submitted,
})
打印的输出是
已进入最近查看的
我不明白为什么没有显示在我的html中,我有类似的类,它几乎做“同样的事情”,这显然是有效的,但没有使用会话。
<div class="mt-6 px-6 py-12 bg-gray-100 rounded-xl">
<h2 class="mb-12 text-2xl text-center">Related items</h2>
<div class="grid grid-cols-3 gap-3">
{% for related_item in related_items %}
<div>
<a href="{% url 'item:detail' related_item.id %}">
<div>
<img src="{{ related_item.image.url }}" class="rounded-t-xl">
</div>
<div class="p-6 bg-white rounded-b-xl">
<h2 class="text-2xl">{{ related_item.name }}</h2>
</div>
</a>
</div>
{% endfor %}
</div>
</div>
感谢谁能回复。
显示图像的 html
您犯了一个错误,那就是您使用的是来自详细函数的值而不是键。 所以应该是这样的:
<div class="mt-6 px-6 py-12 bg-gray-100 rounded-xl">
<h2 class="mb-12 text-2xl text-center">Recently Viewed Items</h2>
<div class="grid grid-cols-3 gap-3">
{% if recently_viewed %}
{% for item in recently_viewed %}
<div>
<a href="{% url 'item:detail' item.id %}">
<div>
<img src="{{ item.image.url }}" class="rounded-t-xl">
</div>
<div class="p-6 bg-white rounded-b-xl">
<h2 class="text-2xl">{{ item.name }}</h2>
</div>
</a>
</div>
{% endfor %}
{% else %}
<p>No recently viewed items.</p>
{% endif %}
</div>
</div>