我正在构建一个由Django驱动的类似博客的应用程序,用于练习和学习。我正在为用户建立一个表单,以便在帖子中发表评论。我有一个采用用户外键的Post模型,和一个采用用户外键和Post外键(用来标识评论所关联的帖子)的Comment模型。
我知道我设置它的方式尚不起作用,但是我只是在尝试调试我一直遇到的CSRF问题。这是我的代码:
models.py
class Comment(models.Model):
date_posted = models.DateTimeField(default=timezone.now)
content = models.TextField()
author = models.ForeignKey(User, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
views.py
@login_required
def post_detail(request, post_id):
if request.method == 'POST':
print("posted")
return redirect('Home')
else:
comment_form = CommentForm()
context = {
'post': Post.objects.get(id=post_id),
'comments': Comment.objects.order_by('date_posted'),
'comment_form': comment_form
}
return render(request, 'feed/postdetail.html', context)
模板,“ postdetail.html”
<form method="POST" enctype="text/plain">
<div class=comment-line>
{% csrf_token %}
{{ comment_form }}
<button type="submit">Post</button>
</div>
</form>
我的中间件中确实包含以下内容
'django.middleware.csrf.CsrfViewMiddleware',
我不断收到错误消息,指出“ CSRF验证失败。请求中止”,原因是“ CSRF令牌丢失或不正确。”这仅在我单击“发布”按钮时发生。
我只是在学习Django,我在做什么错?
答案 0 :(得分:0)
您需要更改html表单并添加CSRF验证,
<form method="POST" enctype="text/plain">
{% csrf_token %}
<div class=comment-line>
{% csrf_token %}
{{ comment_form }}
<button type="submit">Post</button>
</div>
</form>
我添加了此{%csrf_token%},以在您的模板中添加卡片令牌
答案 1 :(得分:0)
我发现问题出在我的表单标签中是“ enctype”。消除它可以解决问题。