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
相关产品推荐
相关产品推荐

