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

时间:2019-11-15 19:34:49

标签: 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={'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!')

如何在第二个视图中使用这两个查询检索到的数据?当第一个视图加载页面时,将执行查询。然后,在同一页面中使用第二个视图。我想在第二个视图中使用两个变量onetwo。有没有办法在Django中做到这一点?

您为什么不在第二个视图中进行相同的查询?因为我希望第二个表单在重新加载方面尽可能快,而不必每次都进行数据库查询使用该视图的时间。另外,由于打开页面时我已经检索了这些值,因此再次执行此操作会很浪费。

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

4 个答案:

答案 0 :(得分:2)

您几乎没有选择:

  1. 最简单的方法:将此数据包含在对第二个视图的请求中(作为表单数据的一部分,请参见下面的example)。您甚至可以使用单个视图:如果发送了POST,则存储数据,否则请求并显示在页面上。
  2. 为此使用缓存(请参见下面的example)-但我建议使用Django built-in package。这是basic example how to use it
  3. 使用Django Sessions(请参见下面的example)-尽管它们还有其他用途,但它是有效的选择。加载客户后,Django将加载完整的会话记录,因此您将所有数据存储在request.session变量中。但这是一个坏习惯:您将获得大量的数据重复并增加数据库内存消耗。
  4. 使用API​​(例如,使用DjangoRestFramework)和常用的Django应用一起使用。这样您就可以在需要时以及需要时获取所需的数据。这些API请求也可以缓存,因此是一种快速的解决方案。

答案 1 :(得分:1)

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

例如,将以下行添加到myview

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

然后,通过引用会话来检索secondview中的数据:

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

答案 2 :(得分:1)

您可以使用Cookie。但是如果您想提高请求的安全性,我建议您使用redispython 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检索值

相关问题