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

Jac*_*022 6 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})
Run Code Online (Sandbox Code Playgroud)

因此,这两个查询检索到的值显示在我的页面上。

现在,在名为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!')
Run Code Online (Sandbox Code Playgroud)

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

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

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

wow*_*in2 6

你有几个选择:

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