我试图在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()})
答案 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