如何在模板django中请求会话值

how to request session value in template django

我想直接在我的模板中获取会话值我有一个请求会话的表单,然后我在另一个 html

中查看该会话

我的 views.py 创建会话的地方

class Product_detail(View):
    def get(self, request, item_id,):
        item = Item.objects.filter(id=item_id)
        category_list = Categories.objects.all()
        items = Item.objects.order_by('-update_at')
        return render (request, 'product_detail.html',{"items" : item, 'category_list': category_list, 'item': items })

    def post(self, request, item_id):
        item = request.POST.get('item')
        size = request.POST.get('Size')
        cart = request.session.get('cart')
        if cart:
            cart[item] = size
        else:
            cart = {}
            cart[item] = size
        request.session['cart'] = cart
        print(request.session['cart'])
        return redirect('products:detail', item_id=item_id)

我的 views.py 我想在其中渲染会话

class Cart(View):
    def get (self, request): 
        cart = request.session.get('cart', None)
        if not cart:
            cart = {} # or however you define your empty cart
        request.session['cart'] = cart
        ids = (list(cart.keys()))
        ids = (list(request.session.get('cart').keys()))
        item = Item.get_items_by_id(ids)
        print(item)
        return render(request, 'cart.html', {'items': item })

我的html代码

 <tbody style="margin-bottom: 20px;">
                              {% for item in items %}
                              <tr>
                                <th scope="row">{{forloop.counter}}</th>
                                <td> <img src="{{item.first.url}}" alt="" height="100px"></td>
                                <td>{{item.name}}</td>
                                  {% for key, value in request.session.cart.items %}
                                      {% if value == value %}
                                        <td>{{ value }}</td> 
                                      {% endif %}
                                  {% endfor %}
                                <td>{{item.price|currency}}</td>
                                <td> <a href="#">Remove</a> </td>
                              </tr>
                              {% endfor %}
                            </tbody>

所以我的会话列表中有两个值,一个是 id,另一个是它的大小,所以现在想向用户显示它选择的大小,它同时显示 id 和大小,但我只想呈现用户选择的大小

想知道如何实现吗

过滤器

@register.filter
def item_size(cart , item):
    return cart[item]

试试这个:

    <td>{{item.name}}</td>
    <td>{{ request.session.cart|item_size:item.id }}</td> 
    <td>{{item.price|currency}}</td>

这将通过使用item的id来获取大小(这是dict中的值)。为确保密钥用作整数,添加:

item = int(request.POST.get('item'))

因此,为了请求会话值,您不能直接呈现它,您必须创建过滤器或然后呈现它,所以在我的例子中,我想呈现产品尺寸,这也是它的价值,所以在我的 templatetag 文件夹中我创建了一个过滤器

我用于获取会话值的过滤器

@register.filter(name='cart_size')
def cart_size(item, cart):
    keys = cart.keys()
    for id in keys:
        if int(id) == item.id:
            return cart.get(id)
    return 'Regular';

并在我的渲染模板中

{{item|cart_size:request.session.cart}}

所以它的作用正如问题中提到的,项目 ID 是键,大小是它的值,我将大小分配给它的项目,所以它的过滤器是在购物车中寻找键,正如你所知,键是 ID,所以我分配 id 等于 item.id 然后它 return 用 id 分配的大小然后在模板中我这样称呼它因为购物车中的所有值所以我也请求它否则它会抛出错误