Djangoを読みました-CSRF検証が失敗し、djangoとPOSTメソッドに関連するいくつかの質問(および回答)があります。最高の答えの1つは、https://stackoverflow.com/a/4707639/755319です。
承認された回答はすべて、少なくとも3つのことを示唆しています。
- render_to_response_callの3番目のパラメーターとしてRequestContextを使用します
- POSTメソッドを使用してすべてのフォームに{%csrf_token%}を追加します
- settings.pyでMIDDLEWARE_CLASSESを確認してください
提案どおりに実行しましたが、エラーが発生しました。私はdjango1.3.1(ubuntu 12.04リポジトリから)とpython 2.7(ubuntuからのデフォルト)を使用しています
これは私の見解です:
# Create your views here.
from django.template import RequestContext
from django.http import HttpResponse
from django.shortcuts import render_to_response
from models import BookModel
def index(request):
return HttpResponse('Welcome to the library')
def search_form(request):
return render_to_response('library/search_form.html')
def search(request):
if request.method=='POST':
if 'q' in request.POST:
q=request.POST['q']
bookModel = BookModel.objects.filter(title__icontains=q)
result = {'books' : bookModel,}
return render_to_response('library/search.html', result, context_instance=RequestContext(request))
else:
return search_form(request)
else:
return search_form(request)
これは私のテンプレート(search_form.html)です:
{% extends "base.html" %}
{% block content %}
<form action="/library/search/" method="post">
{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="Search">
</form>
{% endblock %}
サーバーを再起動しましたが、403 forbiddenエラーがまだ存在し、CSRF検証が失敗したことを示しています。
私は2つの質問があります:
- このエラーを修正するにはどうすればよいですか?
- djangoで「POST」を作成するのが難しいのはなぜですか。つまり、これほど冗長にする特別な理由があります(私はPHPから来ており、これまでにそのような問題を見つけたことはありません)。