Javascript Fetch API PUT方法未更新数据库

Javascript Fetch API PUT方法未更新数据库,javascript,django,django-views,fetch-api,dom-manipulation,Javascript,Django,Django Views,Fetch Api,Dom Manipulation,我的网页上有通过fetchapi“POST”方法显示的帖子,我设法为每一篇帖子创建了一个like/dislike按钮,点击后可以来回切换。当喜欢或不喜欢帖子时,帖子旁边显示的like计数会更新,但在刷新页面时,所有值都会重置,因此数据库中不会更新任何内容。另外,当我转到该帖子的fetchapi路由时,likes计数没有改变 这是一个Django项目。“喜欢/不喜欢”按钮正在处理我在views.py中创建的Fetch API“PUT”方法,但我显然没有正确创建它。控制台中出现“PUT 403(禁止

我的网页上有通过fetchapi“POST”方法显示的帖子,我设法为每一篇帖子创建了一个like/dislike按钮,点击后可以来回切换。当喜欢或不喜欢帖子时,帖子旁边显示的like计数会更新,但在刷新页面时,所有值都会重置,因此数据库中不会更新任何内容。另外,当我转到该帖子的fetchapi路由时,likes计数没有改变

这是一个Django项目。“喜欢/不喜欢”按钮正在处理我在views.py中创建的Fetch API“PUT”方法,但我显然没有正确创建它。控制台中出现“PUT 403(禁止)”错误

型号.py

class Post(models.Model):
    creator = models.ForeignKey("User", on_delete=models.CASCADE, related_name="post_creator")
    content = models.TextField(max_length=250, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    likes = models.IntegerField(blank=True, default=0)

    def serialize(self):
        return {
            "id": self.id,
            "creator": self.creator.username,
            "content": self.content,
            "created": self.created.strftime("%d %b %Y, %H:%M"),
            "likes": self.likes
        }
def post(request, post_id):

    try:
        post = Post.objects.get(creator=request.user, pk=post_id)
    except Post.DoesNotExist:
        return JsonResponse({"error": "No post found."}, status=404)


    if request.method == "GET":
        return JsonResponse(post.serialize())

    elif request.method == "PUT":
        data = json.loads(request.body)
        post.likes = int(data.get("likes")) + 1
        post.save()
        return HttpResponse(status=204)
    
    else:
        return JsonResponse({
            "error": "GET or PUT request required."
        }, status=400)
视图.py

class Post(models.Model):
    creator = models.ForeignKey("User", on_delete=models.CASCADE, related_name="post_creator")
    content = models.TextField(max_length=250, blank=True)
    created = models.DateTimeField(auto_now_add=True)
    likes = models.IntegerField(blank=True, default=0)

    def serialize(self):
        return {
            "id": self.id,
            "creator": self.creator.username,
            "content": self.content,
            "created": self.created.strftime("%d %b %Y, %H:%M"),
            "likes": self.likes
        }
def post(request, post_id):

    try:
        post = Post.objects.get(creator=request.user, pk=post_id)
    except Post.DoesNotExist:
        return JsonResponse({"error": "No post found."}, status=404)


    if request.method == "GET":
        return JsonResponse(post.serialize())

    elif request.method == "PUT":
        data = json.loads(request.body)
        post.likes = int(data.get("likes")) + 1
        post.save()
        return HttpResponse(status=204)
    
    else:
        return JsonResponse({
            "error": "GET or PUT request required."
        }, status=400)
index.js

function likePost(post_id) {
    fetch(`/posts/${post_id}`)
    .then(response => response.json())
    .then(post => {

        let like = document.getElementById(`like-count-${post.id}`);
        console.log(like);
        let likeCount = parseInt(like.innerText);
        console.log("Number of likes: " + likeCount);
        like.innerText = `${++likeCount}`;

        fetch(`/posts/${post_id}`, {
            credentials: 'include',
            method: 'PUT',
            headers: {
                'Content-Type': 'application/json',
                "Access-Control-Allow-Origin" : "*", 
                "Access-Control-Allow-Credentials" : true 
            },
            body: JSON.stringify({
                likes: likeCount
            })
        })
        .then(response => response.json())
        .then(post => {
            console.log(`Post ${post.id} likes is now: ${post.likes}`);

        })

    })
}

如果我需要包含更多信息,请告诉我。

如果这对其他人有帮助,我在post功能上方缺少@csrf\u export。我也意识到,因为我只是对我的资源做了一个小的改变,所以最好使用补丁方法而不是PUT

@csrf_exempt
@login_required
def post(request, post_id):

    try:
        post = Post.objects.get(pk=post_id)
    except Post.DoesNotExist:
        return JsonResponse({"error": "No post found."}, status=404)


    if request.method == "GET":
        return JsonResponse(post.serialize())

    elif request.method == "PATCH":
        data = json.loads(request.body)
        post.likes = data["likes"]
        post.save()
        return HttpResponse(status=204)
    
    else:
        return JsonResponse({
            "error": "GET or PATCH request required."
        }, status=400)

当您从页面执行请求时,会得到什么响应代码?(请参见Chrome开发工具的网络标签)@IvanD抱歉,我实际上忘记了包含我收到的错误,但编辑了我的帖子。我在Fetch PUT上得到了403个禁止响应,在它之前的Fetch GET上得到了200个响应。