16

自分のサイトへのログインを実現したい。基本的に、DjangoBookから次のビットを一緒にコピーして貼り付けました。ただし、登録フォームを送信すると、エラーが発生します(CSRF検証に失敗しました。リクエストは中止されました)。誰かがこのエラーを引き起こした原因とそれを修正する方法を教えてもらえますか?

これが私のコードです:

views.py:

# Create your views here.
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/books/")
    else:
        form = UserCreationForm()
    return render_to_response("registration/register.html", {
        'form': form,
    })

register.html:

<html>
<body>

{% block title %}Create an account{% endblock %}

{% block content %}
  <h1>Create an account</h1>

  <form action="" method="post">{% csrf_token %}
      {{ form.as_p }}
      <input type="submit" value="Create the account">
  </form>
{% endblock %}
</body>
</html>
4

7 に答える 7

19

私はまったく同じ問題を抱えていました-そしてBluePeppersの答えは私を正しい軌道に乗せました。フォームビューにRequestContextを追加すると、問題が修正されます。

from django.template import RequestContext

と:

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
           new_user = form.save()
           return HttpResponseRedirect("/books/")
    else:
        form = UserCreationForm()
    c = {'form': form}
    return render_to_response("registration/register.html", c, context_instance=RequestContext(request))

これで修正されました。

于 2010-08-27T14:58:25.200 に答える
8

Django 1.2.3を使用していますが、断続的に問題が発生しました。

やる事:

csrfトークンがテンプレートに存在することを確認してください

<form action="" method="post">{% csrf_token %}

RequestContextを使用します

return render_to_response('search-results.html', {'results' : results}, context_instance=RequestContext(request) )

GETが同じビュー関数によって処理される場合は、GETにもRequestContextを使用し、同じテンプレートをレンダリングするようにしてください。

すなわち:

if request.method == 'GET':
    ...
    return render_to_response('search-results.html', {'results':results}, context_instance=RequestContext(request) )
elif request.method == 'POST':
    ...
    return render_to_response('search-results.html', {'results':results}, context_instance=RequestContext(request))

いいえ:

if request.method == 'GET':
    ...
    return render_to_response('search-results.html', {'results':results})
elif request.method == 'POST':
    ...
    return render_to_response('search-results.html', {'results':results}, context_instance=RequestContext(request))

'django.middleware.csrf.CsrfViewMiddleware'がsettings.pyにリストされていることを確認します

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)
于 2011-01-16T19:47:40.333 に答える
6

Django 1.2.xを使用していると仮定して、前にこれを追加してください{{form.as_p}}

{% csrf_token %}

そして、その理由を理解するには、 CSRFドキュメントをチェックしてください

于 2010-07-07T17:37:27.640 に答える
2

コンテキストに追加する必要がありcsrf(request)ます。

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response
from django.core.context_processors import csrf

def register(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/books/")
    else:
        form = UserCreationForm()
    con = {'form': form}
    con.update(csrf(request))
    return render_to_response("registration/register.html", con)

Contextコンテキストをオブジェクトに変換する必要があるかもしれませんdictが、原則は健全です。

于 2010-07-07T17:37:13.163 に答える
1

{% csrf_token %}各フォームに追加したくない場合は、これら2つのミドルウェアを設定ファイルに追加します。

MIDDLEWARE_CLASSES = (
    #...
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.middleware.csrf.CsrfResponseMiddleware',
)
于 2010-07-07T21:52:24.047 に答える
1

後で答えます。

render代わりに使用できるようになりましたcontext_instance=RequestContext(request)

from django.shortcuts import render
return render(request, "registration/register.html", {
        'form': form,
    })
于 2015-07-01T10:11:05.023 に答える
1

{%csrf_token%}を使用する場合は、settings.pyのミドルウェアリストから次の行を削除してみてください。

'django.middleware.csrf.CsrfViewMiddleware',

私のために働いた......

于 2018-10-23T10:50:07.677 に答える