2017-08-10 135 views
2

我的django版本是1.11.4,我在我的书中进行了一个简单的练习,我需要创建一个网页,人们可以提交他们对所选内容的评论餐厅。Django:禁止(CSRF令牌丢失或不正确)

但它显示消息Forbidden (CSRF token missing or incorrect.)

views.py:

def comments(request, id): 
    if id != 0: 
     r = Restaurant.objects.get(id = id) 
    else: 
     return HttpResponseRedirect('/restaurantsList/') 

    if request.POST: 
     dateTime = timezone.localtime(timezone.now()) 
     Comment.objects.create(
       content = request.POST['content'], 
       visitor = request.POST['visitor'], 
       email = request.POST['email'], 
       dateTime = dateTime, 
       restaurant = r 
     ) 

    return render_to_response('comments.html', locals(), RequestContext(request)) 

comments.html:

<!doctype html> 
<html> 
<head> 
    <title>Comments</title> 
    <meta charset='utf-8'> 
</head> 

<body> 
    <h2>Comments for {{ r.name }}</h2> 

    {% if r.comment_set.all %} 
     <p>We have {{ r.comment_set.all | length }} comments</p> 

     <table> 
      <tr> 
       <th>Visitor</th> 
       <th>Time</th> 
       <th>Comment</th> 
      </tr> 

      {% for c in r.comment_set.all %} 
       <tr> 
        <td>{{ c.visitor }}</td> 
        <td>{{ c.dateTime | date:'F j, Y' }}</td> 
        <td>{{ c.content }}</td> 
       </tr> 
      {% endfor %} 
     </table> 
    {% else %} 
     <p>No comment</p> 
    {% endif %} 

    <br /><br /> 

    <form action='' method='post'> {% csrf_token %} 
     <table> 
      <tr> 
       <td><label for='visitor'>Visitor: </label></td> 
       <td><input id='visitor' type='text' name='visitor'></td> 
      </tr> 
      <tr> 
       <td><label for='email'>E-mail: </label></td> 
       <td><input id='email' type='text' name='email'></td> 
      </tr> 
      <tr> 
       <td><label for='content'>Comment: </label></td> 
       <td> 
        <textarea id='content' rows='10' cols='48' 
        name='content'></textarea></td> 
       </td> 
      </tr> 
     </table> 
     <input type='submit' value='Submit'> 
    </form> 
</body> 

我以html添加{% csrf_token %},在取景功能使用RequestContext(request)并尝试几种方法我搜索来自网络。但它仍然不起作用。

有人可以帮我吗?谢谢!

回答

3

你应该使用一本更新的书。 render_to_response已弃用,此处不应使用RequestContext。此外,传递locals是一个可怕的反模式,虽然不是你的问题的原因。

return render(request, 'comments.html', {'r': r}) 
+1

如果您正在寻找更多的最新教程,投票教程和Django的女孩教程都是很好的地方开始:https://docs.djangoproject.com/en/1.11/intro/tutorial01 /和https://tutorial.djangogirls.org/en/ – FlipperPA

相关问题