Django | CSRF验证失败

时间:2020-10-12 21:09:39

标签: python django django-csrf

我正在构建一个由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,我在做什么错?

2 个答案:

答案 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”。消除它可以解决问题。