2016-05-20 21 views
1

我想在Django渲染中傳遞多個變量。其中一個是csrf標記,另一個是我的表單(因爲我需要表單中的錯誤)。出於某種原因,它們都不起作用。任何幫助?Django在渲染中傳遞多個變量

這裏是模板:

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

這裏是view.py:

高清登記(請求):

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

爲什麼手動通過csrf{% csrf_token %}會自動執行此操作。

另外,如果您使用的是任何較新版本的Django,則可以使用render()

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

這應該做到這一點。

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, 

) 

這就是說,可能吸塵器明確地傳遞你想要什麼,用字典構造:

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

) 

而且你的模板沒有按原因找不到形式就是它在上下文中不存在。背景有csrf當地人,其中形式居住。您可以參考{{locals.form}}。但這很醜陋。

0

您不需要傳遞您的csrf令牌,您可以用@csrf_protect修飾您的view函數以將令牌傳遞給當前上下文。加入'django.middleware.csrf.CsrfViewMiddleware'

@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保護您的MIDDLEWARE_CLASSES(一般默認添加):此表可被添加到語境詞典。您應該從docs