RequestContextを使いなさい!

今まで動いていた Django 1.3.1 での settings.py の Middleware の部分はこんな感じ。

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.csrf.CsrfResponseMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

確か「django.middleware.csrf.CsrfResponseMiddleware」を自分で加えてる。


コードはこんな感じ。

 return render_to_response('mapitems/confirm.html', {'form':form, 'mapitem':mp})

で、confirm.html の form の部分には「{% csrf_token %}」がちゃんと入ってる。


このコードと html を Django 1.4 の環境にそのままコピーして、Middleware の件は忘れて何もせずに動作させてみた。
結果、フォームの送信で「CSRF verification failed. Request aborted.」となってしまった…。

反射的に「あ、Middleware に何か加えてたっけ!」と思い出して、「django.middleware.csrf.CsrfResponseMiddleware」を MIDDLEWARE_CLASSES に加えて再度挑戦。

すると、今度は nginx がそんなページない!ってエラーを出すようになった…。
ググるdjango.middleware.csrf.CsrfResponseMiddleware は Django 1.4 では deprecated みたいなので、settings.py から削除。


で、結局は「CSRF verification failed. Request aborted.」のエラーページに出ている「The view function uses RequestContext for the template, instead of Context.」という部分が今回の原因。
コードの部分を下記のようにしたら問題なくなった!

return render_to_response('mapitems/confirm.html', context_instance=RequestContext(request, {'form':form, 'mapitem':mp}))

form のコードは何ヵ所かあるのだけど、なぜかこの部分だけが RequestContext 使ってなかった。


というわけで、ダメダメだった自分のコードも修正して、ちゃんと Django 1.4 でも動作するようになりました!


Pythonプロフェッショナルプログラミング

Pythonプロフェッショナルプログラミング

エキスパートPythonプログラミング

エキスパートPythonプログラミング

Django×Python (LLフレームワークBOOKS)

Django×Python (LLフレームワークBOOKS)