2017-12-20 32 views
1

私はDjangoを初めて使用しており、CSRF検証に問題があります。私は今までDjango POSTフォームを作成して成功しており、CSRFエラーはありません。しかし、次のフォームを作成しようとすると、CSRFの検証に失敗します。「CSRFトークンが見つからないか間違っています。ここでDjango CSRF検証に失敗しました

{% for a in answers %} 
    {% csrf_token %} 
    <form class="" action="." method="post"> 
     <input type="submit" value="{{ a.answer }}" name={{a.answer_id}}></input> 
    </form> 
    <p>Number of votes: {{ a.votes }}</p> 
{% empty %} 
    <p>There are no answers for the poll</p> 
{% endfor %} 

は、モデルがどのように見えるかです:ここでは

class Question(models.Model): 
    date_added = models.DateTimeField(auto_now_add=True) 
    question = models.CharField(max_length=200) 
    number_of_answers = models.IntegerField(default=0) 

class Answer(models.Model): 
    question = models.ForeignKey(Question) 
    answer = models.CharField(max_length=200) 
    votes = models.IntegerField(default=0) 

は、そのフォームのビュー機能は、(これまでのところ、私はPOSTリクエストを処理するコードを追加していない)のようになります。

def poll(request, question_id): 
    if request.method == "POST": 
     pass 
    poll = Question.objects.get(id=question_id) 
    answers = poll.answer_set.order_by() 
    context = {'poll' : poll, 'answers' : answers} 
    return render(request, 'polls/poll.html', context) 

基本的に、各質問ごとに複数の回答があります。ユーザーが特定の回答に関連付けられたボタンをクリックできるようにしたい。ユーザーがボタンをクリックすると、データベース内のその回答の投票数を増やしたいと思います(まだこれを行うコードは追加していませんが、これが目標です)。私は、新しく追加された投票でページをリロードするようにしたい。

Here is just an example of what this looks like visually

は、誰もが私が間違っているのか、私が何をしないのですか知っていますか?

ありがとうございました!

答えて

3

CSRFトークンは、フォーム内部に入る:

<form class="" action="." method="post"> 
{% csrf_token %} <!--here goes the token--> 
    <input type="submit" value="{{ a.answer }}" name={{a.answer_id}}></input> 
</form> 
+0

こんにちは、ご回答ありがとうございました。はい、私はそれを試み、私は同じエラーが発生します。 – km786

+0

ページをリロードしましたか? –

+0

これは基本的には正しいですが、上記のコードにはいくつかの問題があります。最初に、CSRFトークンを検証する可能性のあるpythonフォームはありません。次に、フォームのタグがループ内にあるため、多くのフォームがあります。これはこのようには機能しません。グリッチを回避するには、HTMLで1つのフォームしか必要としない適切なPythonフォームを作成します。 – dahrens

関連する問題