CS50 网络 - 项目 4 网络
CS50 Web - Project 4 Network
我目前正在研究 CS50 Web 项目 4 - 网络。任务是设计一个类似 Twitter 的网络。目前,我卡在了Like-Function。
我有一个点赞按钮和点赞计数器。当我点击赞按钮时,页面上的计数器显示“未定义”。但是当我重新加载页面时,一切都很好,点赞数显示了正确的点赞次数,点赞按钮也变成了不喜欢的按钮。有谁知道问题是什么?我现在被困了好几天,无法弄清楚。非常感谢任何帮助。
这是我的代码:
views.py
@csrf_exempt
def like(request, post_id):
post = Post.objects.get(id=post_id)
if request.method == "GET":
return HttpResponseRedirect(reverse("index"))
if request.method == "PUT":
data = json.loads(request.body)
if data.get("like"):
Likes.objects.create(user=request.user, post=post)
post.likes = Likes.objects.filter(post=post).count()
else:
Likes.objects.filter(user=request.user, post=post).delete()
post.likes = Likes.objects.filter(post=post).count()
post.save()
return HttpResponse("done")
java.js
function like(id) {
fetch(`/like/${id}`, {
method: 'PUT',
body: JSON.stringify({
like: true
})
})
.then(post => {
document.querySelector(`#like_count${id}`).innerHTML = post.likes;
});
}
function unlike(id) {
fetch(`/like/${id}`, {
method: 'PUT',
body: JSON.stringify({
like: false
})
})
.then(post => {
document.querySelector(`#like_count${id}`).innerHTML = post.likes;
});
}
在我的 html 上:
<div id="like_count{{post.id}}">Likes: {{ post.likes }}</div>
{% if liked %}
<button class="btn btn-outline-danger" id="unlike_button{{post.id}}" onclick="unlike('{{ post.id }}')">Unlike</button>
{% else %}
<button class="btn btn-outline-primary" id="like_button{{post.id}}" onclick="like('{{ post.id }}')">Like</button>
{% endif %}
- 您的视图仅 returns
"done"
,而不是具有 likes
属性的对象。
您可能需要 return JSONResponse({"likes": post.likes})
之类的东西。
- 值
fetch()
returns 是一个响应。 (您正在尝试访问 likes
。)您需要等待 res.json()
才能将 JSON 响应解码为对象。 (同时,我们可以删除代码中的一些重复。)
function likeOrUnlike(id, like) {
fetch(`/like/${id}`, {
method: "PUT",
body: JSON.stringify({ like: !!like }),
})
.then((resp) => resp.json())
.then((post) => {
document.querySelector(`#like_count${id}`).innerHTML = post.likes;
});
}
function like(id) {
likeOrUnlike(id, true);
}
function unlike(id) {
likeOrUnlike(id, false);
}
我目前正在研究 CS50 Web 项目 4 - 网络。任务是设计一个类似 Twitter 的网络。目前,我卡在了Like-Function。
我有一个点赞按钮和点赞计数器。当我点击赞按钮时,页面上的计数器显示“未定义”。但是当我重新加载页面时,一切都很好,点赞数显示了正确的点赞次数,点赞按钮也变成了不喜欢的按钮。有谁知道问题是什么?我现在被困了好几天,无法弄清楚。非常感谢任何帮助。
这是我的代码:
views.py
@csrf_exempt
def like(request, post_id):
post = Post.objects.get(id=post_id)
if request.method == "GET":
return HttpResponseRedirect(reverse("index"))
if request.method == "PUT":
data = json.loads(request.body)
if data.get("like"):
Likes.objects.create(user=request.user, post=post)
post.likes = Likes.objects.filter(post=post).count()
else:
Likes.objects.filter(user=request.user, post=post).delete()
post.likes = Likes.objects.filter(post=post).count()
post.save()
return HttpResponse("done")
java.js
function like(id) {
fetch(`/like/${id}`, {
method: 'PUT',
body: JSON.stringify({
like: true
})
})
.then(post => {
document.querySelector(`#like_count${id}`).innerHTML = post.likes;
});
}
function unlike(id) {
fetch(`/like/${id}`, {
method: 'PUT',
body: JSON.stringify({
like: false
})
})
.then(post => {
document.querySelector(`#like_count${id}`).innerHTML = post.likes;
});
}
在我的 html 上:
<div id="like_count{{post.id}}">Likes: {{ post.likes }}</div>
{% if liked %}
<button class="btn btn-outline-danger" id="unlike_button{{post.id}}" onclick="unlike('{{ post.id }}')">Unlike</button>
{% else %}
<button class="btn btn-outline-primary" id="like_button{{post.id}}" onclick="like('{{ post.id }}')">Like</button>
{% endif %}
- 您的视图仅 returns
"done"
,而不是具有likes
属性的对象。
您可能需要return JSONResponse({"likes": post.likes})
之类的东西。 - 值
fetch()
returns 是一个响应。 (您正在尝试访问likes
。)您需要等待res.json()
才能将 JSON 响应解码为对象。 (同时,我们可以删除代码中的一些重复。)
function likeOrUnlike(id, like) {
fetch(`/like/${id}`, {
method: "PUT",
body: JSON.stringify({ like: !!like }),
})
.then((resp) => resp.json())
.then((post) => {
document.querySelector(`#like_count${id}`).innerHTML = post.likes;
});
}
function like(id) {
likeOrUnlike(id, true);
}
function unlike(id) {
likeOrUnlike(id, false);
}