2016-05-20 4 views
1

Djangoレンダリングで複数の変数を渡そうとしています。そのうちの1つはcsrfトークンで、もう1つは私のフォームです(フォームからエラーが必要なため)何らかの理由でそれらのどれも動作しません。どんな助け?ここでレンダリングで複数の変数を渡す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を手動で渡すのですか? はそれを自動的に行います。

さらに新しいバージョンのDjangoを使用している場合は、render()を使用できます。

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

これでいいはずです。

1

あなたは{}を使用していなかった場合は litteral辞書、私は変更を提案したいと思います:

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, 
    ) 

) 

と理由あなたのテンプレートのdoesn見つけてのフォームはそれが文脈でそこにないということです。文脈はcsrfおよび地方であり、の形はです。代わりに{{locals.form}}を参照できます。しかし、それは醜いです。

0

csrfトークンを渡す必要はありません。の機能を@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)) 

また、あなたは(通常はデフォルトで追加)ごMIDDLEWARE_CLASSES'django.middleware.csrf.CsrfViewMiddleware'を追加することにより、サイト全体のcsrf保護を行うことができます。 docs

から詳細を読む必要があります。
関連する問題