提取API PUT方法未更新数据库

问题描述

我的网页上有通过Fetch API'POST'方法显示的帖子,并且我设法为每个帖子创建了一个“喜欢/不喜欢”按钮,该按钮在单击时会来回切换。当喜欢或不喜欢该帖子时,该帖子旁边显示的“喜欢”计数会更新,但是在刷新页面时,所有值都会重置,因此数据库中没有任何更新。同样,当我转到该帖子的Fetch API路线时,点赞次数并没有改变。

这是一个Django项目。我在views.py中创建的Fetch API'PUT'方法上使用了like / dislike按钮,但是显然我没有正确创建它。我在控制台中收到“ PUT 403(禁止)”错误

models.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
        }

views.py

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_exempt。我也确实意识到,由于我只是对资源进行了少量更改,因此最好使用PATCH方法而不是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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...