Django 会话 - 最近查看的内容未显示在 html 中

问题描述 投票:0回答:1

我正在使用 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,
    })

打印的输出是 已进入最近查看的 最近查看过 qs , , ]>

我不明白为什么没有显示在我的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

html django session view frameworks
1个回答
0
投票

您犯了一个错误,那就是您使用的是来自详细函数的值而不是键。 所以应该是这样的:

<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>
© www.soinside.com 2019 - 2024. All rights reserved.