You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django产品点赞功能异常:404错误且点赞无法保存

Django Product点赞功能修复方案

你的问题核心是表单字段名不匹配和视图参数逻辑混乱,导致点赞无法保存且触发404错误,以下是具体修复步骤:

1. 修正表单提交的字段名

模板中按钮的name属性是blogpost_id,但视图里尝试获取的是product_id,两者不匹配导致无法正确获取Product ID,直接修改模板代码:

{% if user.is_authenticated %}
<form action="{% url 'product_like' object.id %}" method="POST">
    {% csrf_token %}
  
    {% if post_is_liked %}
        <button type="submit" name="product_id" value="{{object.id}}" >Unlike</button>
    {% else %}
        <button type="submit" name="product_id" value="{{object.id}}">Like</button>
    {% endif %}
</form>
{% else %}
    <a href="{% url 'login' %}?next={{request.path}}">Log in to like this article!</a><br>
{% endif %}
<strong>{{ number_of_likes }} Like{{ number_of_likes|pluralize }}</strong>

2. 简化并修复点赞视图逻辑

视图中已经通过URL拿到了pk,没必要再从POST里获取ID,直接用URL传递的pk查询Product,同时确保逻辑正确:

def ProductLike(request, pk):
    post = get_object_or_404(Product, id=pk)
    if post.likes.filter(id=request.user.id).exists():
        post.likes.remove(request.user)
    else:
        post.likes.add(request.user)

    return HttpResponseRedirect(reverse('product-detail', args=[str(pk)]))

3. 优化详情页视图,避免重复查询

原来的get_context_data重复查询了Product对象,直接使用DetailView自带的self.object即可:

class ProductDetailView(DetailView):
    model = Product
    template_name = 'services/product_detail.html'

    def get_context_data(self, **kwargs):
        data = super().get_context_data(**kwargs)
        # 直接使用当前视图的object,无需重复查询
        liked = self.object.likes.filter(id=self.request.user.id).exists()
        data['number_of_likes'] = self.object.number_of_likes()
        data['post_is_liked'] = liked
        return data

完成以上修改后,点击点赞/取消按钮会正确保存状态,页面刷新后能展示最新的点赞数,同时404错误也会消失。

内容的提问来源于stack exchange,提问作者nameless

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:25:21