django返回并同时为两个不同的表单呈现csrf_token和变量

时间:2013-07-28 17:13:59

标签: django render

我的views.py文件中有一个视图,如下所示:

def index(request):
    c = {}
    c.update(csrf(request))
    if request.method == 'POST':
        form = MyRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/accounts/register_success')

    args = {}
    args.update(csrf(request))

    args['form'] = MyRegistrationForm()

    return render_to_response('index.html', c), render_to_response('index.html', args)

我的index.html看起来像这样:

    <form action="/accounts/auth/" method="post">{% csrf_token %}
        <label for="username">User name:</label>
        <input type="text" name="username" value="" id="username">
        <label for="password">Password:</label>
        <input type="password" name="password" value="" id="password">

        <input type="submit" value="login" />

    </form>
    <h2>Register</h2>
    <form action="/accounts/register/" method="post">{% csrf_token %}
        {{form}}

        <input type="submit" value="Register" />

    </form>

我想为其action =“/ accounts / auth /”的表单呈现c,并为其action =“/ accounts / register /”的表单呈现args ..任何想法我将如何这样做?< / p>

1 个答案:

答案 0 :(得分:1)

不需要两个单独的csrf令牌,并且由于您的词典c不包含令牌以外的任何数据,您可以使用render_to_response('index.html', args)来实现您想要的目标。

甚至更好,使用render(request, 'index.html', args)。我还建议使用模板上下文处理器在视图中获取csrf标记,如here所述。