Fetch API PUT 方法未更新数据库
Fetch API PUT method not updating database
我的网页上有 post 正在通过 Fetch API 'POST' 方法显示,我设法为每个 [= 创建了一个 like/dislike 按钮43=] 单击时来回切换。当 post 被喜欢或不喜欢时,显示在 post 旁边的喜欢计数会更新,但在刷新页面时所有值都会重置,因此数据库中没有任何更新。此外,当我转到 post 的 Fetch API 路线时,点赞数没有改变。
这是一个 Django 项目。 like/dislike 按钮正在使用我在 views.py 中创建的 Fetch API 'PUT' 方法,但显然我没有正确创建它。我在控制台中收到“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)
我的网页上有 post 正在通过 Fetch API 'POST' 方法显示,我设法为每个 [= 创建了一个 like/dislike 按钮43=] 单击时来回切换。当 post 被喜欢或不喜欢时,显示在 post 旁边的喜欢计数会更新,但在刷新页面时所有值都会重置,因此数据库中没有任何更新。此外,当我转到 post 的 Fetch API 路线时,点赞数没有改变。
这是一个 Django 项目。 like/dislike 按钮正在使用我在 views.py 中创建的 Fetch API 'PUT' 方法,但显然我没有正确创建它。我在控制台中收到“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)