我有一个基本视图,可以检索一些数据,呈现我的页面并将一些数据发送到此页面:
def myview(request)
one = values.objects.get(user=request.user).address
two = values.objects.get(user=request.user).number
return render(request, "main/mytemplate.html",
context={'address': one, 'numbers': two})
因此,这两个查询检索到的值显示在我的页面上。
现在,在同一页面上,名为 mytemplate.html ,我正在使用另一个视图,该视图应该处理表单和其他一些操作:
def secondview(request):
if request.method == 'POST':
if 'button1' in request.POST:
form = MyForm(request.POST)
# check whether it's valid:
if form.is_valid():
profile = form.save(commit=False)
profile.user = request.user
profile.save()
return HttpResponseRedirect(request.path_info)
else:
form = MyForm()
return HttpResponse('it works!')
如何在第二个视图中使用这两个查询检索到的数据?当第一个视图加载页面时,将执行查询。然后,在同一页面中使用第二个视图。我想在第二个视图中使用两个变量one
和two
。有没有办法在Django中做到这一点?
您为什么不在第二个视图中进行相同的查询?因为我希望第二个表单在重新加载方面尽可能快,而不必每次都进行数据库查询使用该视图的时间。另外,由于打开页面时我已经检索了这些值,因此再次执行此操作会很浪费。
我不知道这个问题是否足够清楚,但是它的核心是:我可以在Django的两个视图之间传递变量/数据吗?
答案 0 :(得分:2)
您几乎没有选择:
request.session
变量中。但这是一个坏习惯:您将获得大量的数据重复并增加数据库内存消耗。答案 1 :(得分:1)
是的,您可以使用会话在视图之间传递数据。会话的工作方式类似于临时服务器存储,并以字典形式保存所需的数据。
例如,将以下行添加到myview
:
request.session['one'] = one
request.session['two'] = two
然后,通过引用会话来检索secondview
中的数据:
one = request.session['one']
two = request.session['two']
答案 2 :(得分:1)
您可以使用Cookie。但是如果您想提高请求的安全性,我建议您使用redis和python client进行Redis
文件settings.py
redis = redis.Redis(host='localhost', port=6379, db=0)
文件views.py
def view1(request):
redis.set("foo", "boo")
def view2(request):
boo = redis.get("foo")
答案 3 :(得分:1)
为什么不将两个查询的结果保存为第一个模板呈现的表单中的隐藏字段?
<form ...>
<input type="hidden" id="address" name="address" value="{{address}}">
<input type="hidden" id="numbers" name="numbers" value="{{numbers}}">
...
然后,您可以在MyForm中添加“地址”和“数字”表单字段
address = forms.CharField(widget=forms.HiddenInput(), required=False)
...
或者只是从request.POST检索值