我有一个赞按钮,以前运行良好,现在停止运行
@login_required
def like(request):
post_id = request.GET.get("likeId", "")
user = request.user
post = PostForNewsFeed.objects.get(pk=post_id)
liked= False
like = Like.objects.filter(user=user, post=post)
if like:
like.delete()
else:
liked = True
Like.objects.create(user=user, post=post)
resp = {
'liked':liked
}
response = json.dumps(resp)
return HttpResponse(response, content_type = "application/json")
<button class="btn btn-info" id="{{ post.id }}">
{% if post in liked_post %}
<a
href="{% url 'post-like' %}"
style="color: white"
id="likebtn{{ post.id }}"
>
Unlike</a
>
| {{post.likes.count}} {% else %}
<a
href="{% url 'post-like' %}"
style="color: white"
id="likebtn{{ post.id }}"
>
Like</a
>
| {{post.likes.count}} {% endif %}
</button>
urls.py:
path('like/', views.like, name='post-like'),`enter code here`
当我点击喜欢按钮时出现错误:
ValueError at /like/
Field 'id' expected a number but got ''.
Traceback (most recent call last):
File "C:\Python\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
response = get_response(request)
File "C:\Python\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python\lib\site-packages\django\contrib\auth\decorators.py", line 21, in _wrapped_view
return view_func(request, *args, **kwargs)
File "D:\Programming\NewProjecttoReviseAllTechnologies\Django Social Networking Website\djangoNewEnv - Blog Project Before
Buddies\django\mysite\feed\views.py", line 154, in like
post = PostForNewsFeed.objects.get(pk=post_id)
File "C:\Python\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "C:\Python\lib\site-packages\django\db\models\query.py", line 424, in get
clone = self._chain() if self.query.combinator else self.filter(*args, **kwargs)
File "C:\Python\lib\site-packages\django\db\models\query.py", line 941, in filter
return self._filter_or_exclude(False, args, kwargs)
File "C:\Python\lib\site-packages\django\db\models\query.py", line 961, in _filter_or_exclude
clone._filter_or_exclude_inplace(negate, args, kwargs)
File "C:\Python\lib\site-packages\django\db\models\query.py", line 968, in _filter_or_exclude_inplace
self._query.add_q(Q(*args, **kwargs))
File "C:\Python\lib\site-packages\django\db\models\sql\query.py", line 1391, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "C:\Python\lib\site-packages\django\db\models\sql\query.py", line 1413, in _add_q
split_subq=split_subq, check_filterable=check_filterable,
File "C:\Python\lib\site-packages\django\db\models\sql\query.py", line 1345, in build_filter
condition = self.build_lookup(lookups, col, value)
File "C:\Python\lib\site-packages\django\db\models\sql\query.py", line 1191, in build_lookup
lookup = lookup_class(lhs, rhs)
File "C:\Python\lib\site-packages\django\db\models\lookups.py", line 25, in __init__
self.rhs = self.get_prep_lookup()
File "C:\Python\lib\site-packages\django\db\models\lookups.py", line 77, in get_prep_lookup
return self.lhs.output_field.get_prep_value(self.rhs)
File "C:\Python\lib\site-packages\django\db\models\fields\__init__.py", line 1827, in get_prep_value
) from e
ValueError: Field 'id' expected a number but got ''.
[13/Jun/2021 13:01:43] "GET /like/ HTTP/1.1" 500 181410
答案 0 :(得分:0)
url 路径应该包含一个 id
参数:
path('like/<int:id>/', views.like, name='post-like')
在您看来,我们可以与:
@login_required
def like(request, id):
user = request.user
post = PostForNewsFeed.objects.get(pk=id)
liked= False
like = Like.objects.filter(user=user, post=post)
if like:
like.delete()
else:
liked = True
Like.objects.create(user=user, post=post)
resp = {
'liked':liked
}
response = json.dumps(resp)
return HttpResponse(response, content_type = "application/json")
因为您在视图函数中使用了 id
参数。
您需要在 {% url … %}
template tag [Django-doc] 中传递 id:
<!-- ↓ add the id of the post -->
<a href="{% url 'post-like' post.id %}" style="color: white" id="likebtn{{ post.id }}">
模板中指向 {% url … %}
视图的其他 post-like
也应该发生同样的情况。
通常情况下,有副作用的操作应该通过 POST、PUT、PATCH 或 DELETE 请求完成,而不是 GET 请求。因此,制作一个“迷你”表单来发出 POST 请求更有意义。