我是django的新手,我需要一些关于这个代码的例子。
我有一个文本框和同一模板上的输出,这是以下视图:
def sessiontest(request):
a=request.session.get('a',{})
form=sform()
return render_to_response('cart.html',{'form':form,'a':a},context_instance=RequestContext(request))
以及处理数据的视图是:
def sessiontest2(request):
if request.method=="POST":
form=sform(request.POST)
if form.is_valid():
request.session['a']=form.cleaned_data["name"]
return HttpResponseRedirect(reverse(sessiontest))
如果我只需要存储一个值,它工作正常,但是如果每次有{value1,value2,new_value,new_value}
这样的新输入时,如何允许我的request.session ['a']存储多个数据?我需要它采用的格式是我可以在模板中使用{% for i in a %}
循环显示,并用于过滤我的模型。
这只是一个测试代码,稍后我将需要将product_id存储在其中并使用它以这种方式过滤我的项目:
items=models.products.objects.filter(pk=request.session["a"])
请给我一些关于如何做到这一点的提示。
答案 0 :(得分:2)
如果您从视图中传递模板中的列表,则可以使用此{% for i in a %}
。与查询items=models.products.objects.filter(pk=request.session["a"])
一样,将提供可以迭代和显示属性的对象列表。
如果要存储多个项目,可以使用字典。 request.session['a']['value1'] = 'value1'
您可以使用
访问模板中的字典{% for key, val in dict.items %}
<td>{{ key }}</td>
<td>{{ val }}</td>
{% endfor %}
或者你可以使用for循环计数器来区分值,同时像这样stroing
count=0
for i in val:
count+=1
request.session[a+str(count)]=i
然后您可以像request.session["a1"]
一样访问它,依此类推其他值
希望有所帮助
答案 1 :(得分:1)
最好的方法是创建另一个模型,该模型将存储该会话的会话ID,并且该模型与您的产品对象之间存在许多联系。
Models.py
类Storedsessionproducts(models.Model): products = models.ManytoManyField(Products,null = True,related-name =“ storedproducts”)
现在在您的view.py中,将您的会话ID设置为该会话创建的Storedsessionproducts #使用session_id检索当前的Storedsessionproducts对象 然后从中取出所有产品 session_id = request.session.get('cart_id')
## assuming you have successfully created Storedsessionproducts
# add all created products in Storedsessionproducts
request.session['cart_id']=Storedsessionproducts.id
答案 2 :(得分:0)
您希望将数据存储为值列表。一个简单的方法是:
request.session.setdefault('a', []).append(form.cleaned_data['name'])
如果会话中不存在键'a'
,则会将空列表设置为默认列表,然后将该名称附加到新列表或现有列表。您可以使用以下查询查询这些对象:
Products.objects.filter(id__in=request.session.get('a', []))