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

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有办法吗?
为什么不在第二个视图中进行相同的查询?因为我希望第二个表单在重新加载方面尽可能快,而不必每次使用该视图时都执行DB查询。另外,由于我已经在页面打开时检索了这些值,所以再次这样做是浪费。
我不知道这个问题是否足够清楚,但它的核心是:我可以在django的两个视图之间传递变量/数据吗?

最佳答案

你几乎没有选择:
最简单的方法:将此数据包含在对第二个视图的请求中(作为表单数据的一部分,请参见下面的example)。您甚至可以使用单个视图:如果POST是send-store数据,则执行请求并将其显示在页面上。
使用缓存(见下面的example)-但我建议使用Django built-in package。这里有一个basic example how to use it
使用Django Sessions(见下面的example)-这是一个工作选项,尽管它们有另一个用途。加载customer时,Django将加载完整的会话记录,因此您将在request.session变量中拥有所有数据。但这是一种糟糕的做法:您可能会得到大量重复数据,并增加数据库内存消耗。
将API(例如,使用DjangoRestFramework)与通常的Django应用程序一起使用。所以你只需要得到你需要的数据,并且当你需要的时候。这些API请求也可以被缓存,因此它是一个快速的解决方案。

09-06 05:27
查看更多