Django在渲染中传递多个变量

时间:2016-05-20 21:45:48

标签: python django

我试图在Django渲染中传递多个变量。其中一个是csrf令牌,另一个是我的表单(因为我需要表单中的错误)由于某种原因,它们都不起作用。有什么帮助吗?

以下是模板:

<form class = "navbar-form" action="{% url "registry.views.register" %}" onsubmit=" return ClickButton();  " method= "POST" >
{% csrf_token %}
{{ form.errors}} {{ form.non_field_errors }} 

这是view.py:

def注册(请求):

form_save = RegisterationForm()
if request.method == 'POST':
    form = RegisterationForm(request.POST)

    if form.is_valid():

        user_info={}
        user_info['username'] = form.cleaned_data['username']
        user_info['password'] = form.cleaned_data['password']


        form.save(user_info)
        return render_to_response('register_success.html',user_info)

    else:
        form_save = form


return render_to_response('register.html',{'csrf':csrf(request),'locals':locals()})

3 个答案:

答案 0 :(得分:4)

为什么要手动传递csrf{% csrf_token %}会自动执行此操作。

此外,如果您使用的是任何较新版本的Django,则可以使用render()

return render(request, 'register.html', {'form': form})

应该这样做。

答案 1 :(得分:1)

如果您没有使用 {} 字母词典,我建议您更改:

return render_to_response('register.html',{'csrf':csrf(request),'locals':locals()})

使用**扩展locals() - 将字典返回到关键字。但那可能行不通。

return render_to_response('register.html',{'csrf':csrf(request),**locals()})

请改为尝试:

my_dict = {csrf:csrf(request)}

my_dict.update(locals())

return render_to_response(
    'register.html',
    my_dict,

)

那就是说,使用 dict 构造函数明确传递你想要的东西可能更干净:

return render_to_response(
    'register.html',
    dict(
        csrf=csrf(request),
        user_info=user_info,
        form=form,
    )

)

您的模板找不到形式的原因是它不在上下文中。上下文包含 csrf 本地,其中表单位于此处。您可以参考 {{locals.form}} 。但那很难看。

答案 2 :(得分:0)

您无需传递csrf令牌,您可以使用view修饰@csrf_protect函数,将令牌传递给当前上下文。表单可以添加到上下文字典中:

@csrf_protect
def your_view(request):
    # process request

    # add form to context dictionary, and return RequestContext for current request
    return render_to_response('register.html', {'form': form}, RequestContext(request))

或者,您可以通过向csrf添加'django.middleware.csrf.CsrfViewMiddleware'来进行网站范围MIDDLEWARE_CLASSES保护(默认情况下通常会添加)。您应该从docs

中了解更多信息