Django/Python:如何通过POST方法将变量从表单传递到Python脚本?

1 投票
2 回答
1742 浏览
提问于 2025-04-18 12:10

我在提交的时候遇到了这个错误:

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>

撰写回答