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

2024-04-26 01:11:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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})

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

现在,在同一页上,叫做我的模板.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的两个视图之间传递变量/数据吗?你知道吗


Tags: 数据form视图returnifobjectsrequestdef
3条回答

你可以用饼干。但是,如果您想要更安全的请求,我建议您使用redispython clientfor 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")

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

例如,将以下行添加到myview

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

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

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

您几乎没有选择:

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

相关问题 更多 >