Django/Python:如何通过POST方法将变量从表单传递到Python脚本?
我在提交的时候遇到了这个错误:
CSRF verification failed. Request aborted.
我按照文档走到这一步,但我并不完全理解,肯定是哪里错了。我只是想把搜索框里的查询词传给一个Python脚本作为参数。我是Django的新手,遇到最简单的事情都卡住了。
在models.py文件里:
class QueryForm(forms.Form):
query = forms.CharField(label='query',max_length=100)
我在urls.py文件里加了这一行:
url(r'^results/$', 'tweemo.views.results'),
在我的主页上,搜索框的代码是这样的:
<form action="/home/results/" method="post">
<label for="query">Search:</label>
<input id="query" type="text" name="query" value="{{ current_query }}">
<input type="submit" value="ok">
</form>
在views.py文件里,我添加了这两个函数:
def get_query(request):
if request.method == 'POST':
form = QueryForm(request.POST)
if form.isvalid():
return HttpResponseRedirect('/thanks/')
else:
form = QueryForm()
return render(request, 'results.html', {'form': form})
def results(request):
return render_to_response('results.html',{'here':TwitterStream.objects.all() })
我的results.html文件里就只有这些:
<form action="/home/results/" method="post">
{% csrf_token %}
{{ form }}
<input type="submit" value="Submit"/>
</form>
2 个回答
1
问题在于你没有把csrf令牌传递给表单。你需要把csrf令牌传递给渲染函数,这样它才能在表单中生效。要做到这一点,你需要把csrf令牌和请求关联起来。
def get_query(request):
if request.method == 'POST':
form = QueryForm(request.POST)
if form.isvalid():
return HttpResponseRedirect('/thanks/')
else:
form = QueryForm()
args = {}
args.update(csrf(request))
args['form'] = form
return render_to_response('results.html', args)
def results(request):
return render_to_response('results.html',{'here':TwitterStream.objects.all() })
2
你只需要在每一个使用了 post
方法的 表单 标签 <form></form>
中添加 {% csrf_token %}
这个标记。
所以下面的代码需要进行修改:
<form action="/home/results/" method="post">
{% csrf_token %}
<label for="query">Search:</label>
<input id="query" type="text" name="query" value="{{ current_query }}">
<input type="submit" value="ok">
</form>