2013-11-22 11 views
0

Я новичок в Django и следую this tutorial, чтобы добавить кнопку Like к модулю. У меня есть взгляды, как это:Недопустимый токен Django CSRF для FormView

class VoteFormView(FormView): 
    form_class = VoteForm 

    def form_valid(self, form): 


     pic = get_object_or_404(UserPic, pk=form.data["pic"]) 
     user = self.request.user 
     prev_votes = Vote.objects.filter(voter=user, pic=pic) 
     has_voted = (prev_votes.count() > 0) 



     if not has_voted: 
      # add vote 
      Vote.objects.create(voter=user, pic=pic) 
      print("voted") 
     else: 
      # delete vote 
      prev_votes[0].delete() 
      print("unvoted") 

     return render_to_response('userpics/photo.html', 
             {'pic':pic}) 

    def form_invalid(self, form): 
     print("invalid") 
     return render_to_response('userpics/photo.html', 
             {'pic':pic}) 

В photo.html у меня есть:

{% if pic %} 

<form method="post" action="/photo/vote/" class="vote_form"> 
    <li> [{{ pic.votes }}] 
    {% csrf_token %} 
    <input type="hidden" id="id_pic" name="pic" class="hidden_id" value="{{ pic.pk }}" /> 
    <input type="hidden" id="id_voter" name="voter" class="hidden_id" value="{{ user.pk }}" /> 
    <button>Like</button> 

</form> 

<img class="pic" src="/static/assets/{{pic}}" /> 


{% endif %} 

Когда я щелкаю, как ссылку на страницу с фотографией во второй раз, я получаю эту ошибку:

Forbidden (403) 

CSRF verification failed. Request aborted. 

Я пробовал:

return render_to_response('userpics/photo.html', 
           {'pic':pic,}, 
           context_instance=RequestContext(request)) 

Но поскольку это представление не имеет объекта «запрос», вышеуказанный оператор также вызывает ошибку. Поэтому я не уверен, как реализовать csrf для этого представления и оценить вашу помощь.

ответ

1

получить доступ к запросу с помощью self.request, поэтому попробуйте:

return render_to_response('userpics/photo.html', 
          {'pic':pic,}, 
          context_instance=RequestContext(self.request)) 
+0

спасибо человеку. Это решило проблему. – hbp

Смежные вопросы