我需要在另一个视图的一个视图中使用用户提交的数据。我不希望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数据导入下一个视图?
答案 0 :(得分:1)
我认为您对应该提交表单的位置感到困惑。您编写了代码以接受POST
中的index()
,因此您绝对应该POST
到index()
。您还将foo
定义为results_view
的参数,然后在重定向时,您无法简单地重定向到/results/
,而是/results/<foo_id>
。
虽然您已正确实施了大部分常规流程,但我上面提到的许多细节都缺失了,所以请仔细阅读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})