/like/ 字段 'id' 处的 ValueError 需要一个数字,但得到了 ''

时间:2021-06-13 07:22:00

标签: django

我有一个赞按钮,以前运行良好,现在停止运行

@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

1 个答案:

答案 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 请求更有意义。