Djangoここで、これを長い間修正しようとしています。ミドルウェアクラスに「Django.middleware.csrf.CsrfViewMiddleware」があり、トークンがあります。私の投稿フォームで。
ここに私のコードがありますが、何が間違っていますか?
from Django.contrib.auth.forms import UserCreationForm
from Django.shortcuts import render_to_response
from Django.http import HttpResponseRedirect
from chartsey.authentication.forms import RegistrationForm
from Django.template import RequestContext
from Django.core.context_processors import csrf
def register(request):
if request.method == 'POST':
c = RequestContext(request.POST, {})
form = RegistrationForm(c)
if form.is_valid():
new_user = form.save()
return HttpResponseRedirect("/")
else:
form = RegistrationForm()
return render_to_response("register.html", {'form': form, }, )
これが私のテンプレートです:
{% block content %}
<h1>Register</h1>
<form action="" method="POST"> {% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit">
</form>
{% endblock %}
最近では、render
ショートカット関数return render(request, 'template.html')
を使用する必要があります。この関数はRequestContext
を自動的に使用するため、以下のアドバイスは8年ほど古いものです。
render
を使用 https://docs.djangoproject.com/en/2.2/topics/http/shortcuts/{% csrf_token %}
テンプレートタグ私の推測では、テンプレートにはタグがありますが、何もレンダリングしていません(または実際のHTMLでCSRFトークンが生成されていることを確認したということですか?)
辞書の代わりにRequestContext
を使用する
render_to_response("foo.html", RequestContext(request, {}))
または、Django.core.context_processors.csrf
あなたのCONTEXT_PROCESSORS
設定。
これをビューに追加するだけです
return render_to_response("register.html", {'form': form, }, context_instance = RequestContext(request))
それが動作します!!
render_to_responseの代わりにrenderを使用してみてください:
from Django.shortcuts import render
render(request, "foo.html", {})
Django-render()、render_to_response()、direct_to_template()の違いは何ですか?
上記のリンクで述べたように、それはDjango 1.3で導入され、自動的にRequestContextを使用します
RequestContext
の追加は、@ Yuji 'Tomita' Tomitaと@Njogu Mbauが言及したように、render_to_response
を使用する際のキーです。ただし、この問題に苦労して最初に私を驚かせたのは、テンプレートを最初にロードするviews.py
の関数と、テンプレートからの送信を処理するviews.py
の関数の両方にRequestContext
を追加する必要があったことです。
また、参考のために、この同じ問題を説明する他のリンクをいくつか紹介します
CsrfViewMiddlewareを使用していない場合は、csrf_tokenテンプレートタグを使用するすべてのビュー、およびPOSTデータを受け入れるビューでcsrf_protectを使用する必要があります。
Django-livereload-serverをインストールした後、一部のページでこのエラーがランダムに発生しました。 Django-livereload-serverをアンインストールするとうまくいきました。