2017-01-12 16 views
5

をレンダリングします。ジャンゴ - CSRFトークン生成 - render_to_response対私はジャンゴで簡単なユーザ登録フォームにしようとしています

として:私はrender_to_response

戻りrender_to_response({RegistrationForm() '形態'} ')登録/ register.html'、RequestContextの(要求を)使用する場合、CSRFトークンが生成され取得されていません私はリターンレンダリングrender

を使用する場合、CSRFトークンが生成されつつある(リクエスト、 '登録/ register.html' { '形態':RegistrationForm()})

私は、次のrender_to_response

で何も悪いことをやっているお勧めのアプローチはrender代わりのrender_to_responseを使用することです関連するコードブロック

views.py

@csrf_protect 
def register(request): 
    if request.method == 'POST': 
     form = RegistrationForm(request.POST) 
     if form.is_valid(): 
      user = User.objects.create_user(
       username=form.cleaned_data['username'], 
       password=form.cleaned_data['password1'], 
       email=form.cleaned_data['email'] 
      ) 
      return HttpResponseRedirect('/register_success/') 
    else: 
     return render_to_response('registration/register.html', RequestContext(request, {'form': RegistrationForm()})) 

register.html

{% extends "base.html" %} 
{% block title %}User Registration{% endblock %} 

{% block content %} 
    <form method="post" action="."> 
     {% csrf_token %} 
     <table border="0"> 
      {{ form.as_table }} 
     </table> 
     <input type="submit" value="Register" /> 
    </form> 
{% endblock %} 

答えて

8

です。コードはより簡単で、renderは要求コンテキストを使用してテンプレートをレンダリングするため、CSRFトークンが機能します。

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

The docs recommend that you don't use render_to_response。 Django 1.10より前には、手動でRequestContextを3番目の引数として渡すことができましたが、これはDjango 1.10以降では不可能です。 2番目の引数にはRequestContextを使用していますが、2番目の引数は正規の辞書でなければなりません。

最後に、フォームが無効な場合に応答を返さないことに注意してください。コードを少し調整して修正することができます:

if request.method == 'POST': 
    form = RegistrationForm(request.POST) 
    if form.is_valid(): 
     ... 
     return HttpResponseRedirect('/register_success/') 
else: 
    form = RegistrationForm() 
return render(request, 'registration/register.html', {'form': form})