Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中的不同视图之间传递数据_Python_Django_Django Forms_Django Views - Fatal编程技术网

Python 在Django中的不同视图之间传递数据

Python 在Django中的不同视图之间传递数据,python,django,django-forms,django-views,Python,Django,Django Forms,Django Views,我有一个基本视图,用于检索一些数据、呈现我的页面并将一些数据发送到此页面: 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={

我有一个基本视图,用于检索一些数据、呈现我的页面并将一些数据发送到此页面:

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有没有办法做到这一点

为什么不在第二个视图中进行相同的查询?因为我希望第二个表单在重新加载方面尽可能快,而不必每次使用该视图时都进行DB查询。此外,由于我在打开页面时已经检索到了这些值,因此再次这样做将是一种浪费


我不知道这个问题是否足够清楚,但它的核心是:我可以在django中的两个视图之间传递变量/数据吗?

是的,您可以使用会话在视图之间传递数据。会话的工作方式类似于临时服务器存储,并将所需数据保存在字典形式中

例如,将以下行添加到
myview

request.session['one'] = one
request.session['two'] = two
然后,通过参考会话在
secondview
中检索数据:

one = request.session['one']
two = request.session['two']

你可以用饼干。但是,如果您希望您的请求更安全,我建议您使用和for redis

文件设置.py

redis = redis.Redis(host='localhost', port=6379, db=0)
文件视图.py

def view1(request):

    redis.set("foo", "boo")

def view2(request):

    boo = redis.get("foo")
您几乎没有选择:

  • 最简单的方法:将此数据包含在第二个视图的请求中(作为表单数据的一部分,请参见下面的示例)。您甚至可以使用单个视图:如果POST是发送的,则存储数据,否则请执行请求并将其显示在页面上
  • 为此使用缓存(请参阅下面的示例)-但我建议使用。这是一个
  • 使用(见下文)-这是一个可行的选择,尽管他们有另一个目的。当客户被加载时,Django将加载完整的会话记录,所以您将在
    request.session
    变量中拥有所有数据。但这是一种糟糕的做法:可能会导致大量数据重复,并增加数据库内存消耗
  • 将API(例如使用)与常用的Django应用程序一起使用。因此,您只需在需要时获取所需数据。这些API请求也可以缓存,所以这是一个快速的解决方案

  • 为什么不将两个查询的结果保存为第一个模板呈现的表单中的隐藏字段

    <form ...>
    
        <input type="hidden" id="address" name="address" value="{{address}}">
        <input type="hidden" id="numbers" name="numbers" value="{{numbers}}">
    
        ...
    

    或者只是从请求中检索值。POST

    您可以包括表单和模板吗?如果您没有对queryset的性能进行基准测试,我不会在视图之间传递数据。甚至需要考虑这样的解决方案,数据库层需要一个主要瓶颈。“过早优化是万恶之源”@KamilNiski我知道,事实是查询数据库需要花费我不想花费的不必要的一秒钟waste@Jack022真的需要一秒钟吗?看起来该查询未正确构建,或者queryset检索的数据太多。在会话中存储对象时应谨慎。请记住,您在会话中输入的任何内容都必须是可序列化的。最安全的方法是只存储原始类型的图片!但是,如果我要存储的数据是敏感数据,会发生什么?这样做安全吗?如果我要使用的数据是敏感数据,会发生什么情况?这仍然是一种安全的方式吗?你说的“敏感数据”是什么意思。您可以配置您的redis服务器。例如,将数据持久化到存储器。好的!谢谢你的回答,现在一切都清楚了!现在看来这是正确的方法,谢谢你的例子!
    address = forms.CharField(widget=forms.HiddenInput(), required=False)
    ...