【问题标题】:How do I pass a list from one view to another in Django?如何在 Django 中将列表从一个视图传递到另一个视图?
【发布时间】:2014-10-15 03:46:04
【问题描述】:

我一直在搜索 StackOverflow,但没有找到适合我的答案。我对 Python 和 Django 比较陌生,所以也许我想错了。

举一个简单的例子,想象两个具有不同关联 URL 的视图。这不应该是完美的代码。我只是想弄清楚如何从视图 1 到视图 2 中获取可变长度的项目列表。我看不到通过 URL 执行此操作的方法,因为列表可能很长。这不是很容易做到吗?

def view2(request, list_to_process):

     use list_to_process to manufacture formset (e.g. make a formset with one entry for each item in the list)
     return render(request, 'Project/template2.html', {'formset': formset})

def view1(request):

    if request.method == "POST":
        if form.is_valid():
            result = form.cleaned_data
            list_to_process = []
            for item in result:
                list_to_process.append(item)
            *WHAT CODE DO I USE HERE TO CALL VIEW2 AND SEND IT list_to_process AS AN ARGUMENT OR REQUEST ADDITION?*
    else:
        formset = formsettype()
        helper = AssayHelper() (defined elsewhere)
        helper.add_input(Submit("submit", "Submit")
        return render(request, 'Project/template1.html', {'formset': formset, 'helper': helper})

有人可以帮忙吗?谢谢。

【问题讨论】:

  • 为什么不能放入会话中?

标签: python django list django-views


【解决方案1】:

这正是会话的目的。在视图 1 中:

request.session['list'] = list_to_process

在视图 2 中:

list_to_process = request.session['list']

【讨论】:

  • 这仍然是基于类的视图吗?还是有另一种方法?谢谢。
  • 使用什么样的视图没有任何区别,会话是在视图之间持久化对象的正确方式。
  • 您能否指导我看一个示例,上面的实现用于将参数从一个基于类的视图传递到另一个?
【解决方案2】:

如果您愿意使用session,那么请使用@Daniel 给出的答案,

但在您的情况下,您似乎不会使用单独的 url,您只需要在同一个 url 中呈现它,但需要该视图的输出,在这种情况下,请从 named paramter 这样的 python 函数中获取帮助-

def view2(request, list_to_process=None, **kwargs):

     use list_to_process to manufacture formset (e.g. make a formset with one entry for each item in the list)
     return render(request, 'Project/template2.html', {'formset': formset})

def view1(request):

    if request.method == "POST":
        if form.is_valid():
            result = form.cleaned_data
            list_to_process = []
            for item in result:
                list_to_process.append(item)
            return view2(request, list_to_process=list_to_process)
    else:
        .....

使用named parameter 的好处是,它们是可选的,因此如果未提供它们也不会引发错误,例如,当直接从view1 内部调用视图时

【讨论】:

  • 确实,它只是同一个 views.py 中的另一个函数 - 你可以简单地.. 调用它:)
猜你喜欢
  • 1970-01-01
  • 2019-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 2019-05-24
  • 1970-01-01
  • 2017-05-20
相关资源
最近更新 更多