如何在模板django中请求会话值
Posted
技术标签:
【中文标题】如何在模板django中请求会话值【英文标题】:how to request session value in template django 【发布时间】:2021-10-09 17:18:25 【问题描述】:我想直接在 myy 模板中获取会话值,我通过该模板请求会话,然后我在另一个 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" ></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]
【问题讨论】:
这能回答你的问题吗? Use variable as dictionary key in Django template @bdbd 我试过但没用,它说过滤器无效 你能用你的尝试更新问题吗 更新了问题的样子 应该是 request.session.cart|item_size:item
【参考方案1】:
试试这个:
<td>item.name</td>
<td> request.session.cart|item_size:item.id </td>
<td>item.price|currency</td>
这将通过使用item
的 id 来获取大小(即字典中的值)。要确保键用作整数,请添加:
item = int(request.POST.get('item'))
【讨论】:
这意味着我必须为其他所有尺寸都这样做 我只想显示那个尺寸而不是所有尺寸 哪个用户选择了添加的屏幕截图,除了大小之外,它的外观如何获取 我要小于size的尺寸 一切顺利!太好了,你不再被困住了【参考方案2】:因此,对于请求会话值,您不能直接渲染它,您必须创建过滤器或然后渲染它,所以在我的情况下,我想渲染产品大小,这也是它的值,所以在我创建的 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 然后它返回分配给 id 的大小,然后在模板中我这样称呼它,因为购物车中的所有值所以我也要求这样做,否则它会抛出错误
【讨论】:
以上是关于如何在模板django中请求会话值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 django 保持 tensorflow 会话在内存中运行