【问题标题】:Using data from one view in another view在另一个视图中使用来自一个视图的数据
【发布时间】:2015-12-22 12:30:15
【问题描述】:

我需要在另一个视图中使用用户在一个视图中提交的数据。我不希望 URL 中的数据,并且无法通过调用最后创建的对象来提取数据,因为很多时候它不会是那个对象。

我的索引视图如下所示:

def index(request):

    template_name = 'index.html'

    if request.method  == 'POST':
        foo = request.POST['foo_text']
        Foo.objects.get_or_create(foo=foo)
        return redirect('/results/')

    return render(request, template_name, {})

这个视图的模板是:

<html>
<title> Some Site </title>  
<h1> Some site </h1>

<form action="/results/" method="POST" > 
    <input type="text" name="foo_text" id="id_foo_lookup" placeholder="Enter Your Foo">
    {% csrf_token %}
</form>

处理数据结果的视图是:

def results_view(request, foo):

    template_name = 'movement_results.html'
    results = Results.objects.filter(foo=foo)

    return render(request, template_name, {'results' : results })

如您所见,用户将在 index.html 中键入一些数据 foo,然后如果该对象在数据库中不存在,则该对象将获取或创建该对象。结果视图将根据用户之前提交的数据返回结果。如何获取 foo 数据到下一个视图?

【问题讨论】:

  • 请关注django tutorial,你会为很多人节省很多时间。
  • 您的代码对我来说没有多大意义。您的表单提交会将POST 的数据/results/,它指向index 方法,然后您将redirect 再次/result/?听起来render_view 从未被访问过?
  • 将数据提交到索引然后重定向到结果视图会更好吗?
  • @spetras 我已经完成了本教程以及其他一些教程。如果有什么我错过的东西可以回答我的问题,我觉得将我引导到该页面而不是因为提出问题而受到指责会更有益。

标签: django


【解决方案1】:

我认为您对表单应该提交到哪里感到困惑。你写的代码在index() 中接受POST,所以你绝对应该POSTindex()。你还定义了foo作为results_view的参数,那么当你重定向时,你不能简单地重定向到/results/,而是/results/&lt;foo_id&gt;

虽然您已经正确实现了大部分通用流程,但我上面提到的许多细节您都遗漏了,所以请仔细阅读 django 手册。

这是我解决您的困惑的尝试(未经测试):

索引方法:

def index(request):    
    template_name = 'index.html'
    if request.method  == 'POST':
        foo_text = request.POST['foo_text']
        foo, created = Foo.objects.get_or_create(foo=foo_text)
        return redirect('/results/%s' % foo.id)

    return render(request, template_name, {})

index.html:

<html>
<title> Some Site </title>  
<h1> Some site </h1>

<form action="" method="POST" > 
    <input type="text" name="foo_text" id="id_foo_lookup" placeholder="Enter Your Foo">
    {% csrf_token %}
</form>

results_view 方法:

from django.shortcuts import get_object_or_404

def results_view(request, foo_id):    
    template_name = 'movement_results.html'
    result = get_object_or_404(Result, pk=foo_id)

    return render(request, template_name, {'result' : result})

【讨论】:

  • 谢谢,我试图避免将 foo.id (如 results/foo.id)放在 url 中,这就是我问这个问题的原因。我真的只是希望 results/ 能够在不包含在 url 中的情况下检索 id。会话和 cookie 是我应该关注的重点,还是我只是给自己做了一堆不必要的工作?
  • 有很多方法可以做到这一点,你可以使用django会话变量,使用临时文件,像rabbitmq这样的消息队列,或者像redis这样的内存数据库等。也许从django会话开始。跨度>
  • 再次感谢您,这正是我想要的。
  • 如果您不确定,google 是您的朋友。通过谷歌搜索 django session 给了我这个:stackoverflow.com/questions/14465993/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-14
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多