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

Django问题:无法将评论关联至特定Product对象

问题描述

评论能成功存入数据库,但无法关联到对应的商品,不清楚如何通过slug将评论和特定Product对象绑定。


相关代码

views.py

class ProductDetail(DetailView):
    model = Product
    template_name = 'store/product-single.html'
    context_object_name = 'product'


    def get_context_data(self, **kwargs):
        context = super().get_context_data()
        products = Product.objects.all()[:4]
        context['products'] = products
        product = Product.objects.get(slug=self.kwargs['slug'])
        context['title'] = product.title
        context['comment_form'] = CommentForm()
        context['comments'] = Comment.objects.all()
        return context

def save_comment(request):
    form = CommentForm(request.POST)
    if form.is_valid():
        comment = form.save(commit=False)
        # comment.product = Product.objects.filter()
        comment.save()
        return redirect('index')

urls.py

path('save_comment/', save_comment, name='save_comment')

product-single.html

<div class="container">
  <form action="{% url 'save_comment' %}" method="POST">
    {% csrf_token %}
    {{ comment_form.as_p }}

    <button type="submit" class="btn btn-primary  btn-lg">Submit</button>
  </form>
</div>

models.py

class Comment(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True)
    user = models.CharField(default='', max_length=255)
    text = models.TextField(default='')

forms.py

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ['user', 'text']
        widgets = {
            'user': forms.TextInput(),
            'text': forms.Textarea()
        }

解决方案

核心问题是提交评论时没传递当前商品的slug,导致无法关联对应Product对象,按以下步骤修改:

  • 在表单中添加商品slug隐藏字段
    修改product-single.html,把当前商品的slug通过隐藏字段传给后端:

    <div class="container">
      <form action="{% url 'save_comment' %}" method="POST">
        {% csrf_token %}
        {{ comment_form.as_p }}
        <!-- 新增隐藏字段传递商品slug -->
        <input type="hidden" name="product_slug" value="{{ product.slug }}">
        <button type="submit" class="btn btn-primary  btn-lg">Submit</button>
      </form>
    </div>
    
  • 修改save_comment视图绑定商品
    更新views.py里的save_comment函数,从POST请求中取slug,查询对应商品并绑定到评论:

    def save_comment(request):
        form = CommentForm(request.POST)
        if form.is_valid():
            comment = form.save(commit=False)
            # 从POST获取slug,查询对应商品
            product_slug = request.POST.get('product_slug')
            comment.product = Product.objects.get(slug=product_slug)
            comment.save()
            # 建议提交后跳回商品详情页,而非首页
            return redirect('product_detail', slug=product_slug)
        # 表单验证失败时返回原页面
        return redirect(request.META.get('HTTP_REFERER', 'index'))
    
  • 优化商品详情页的评论展示(可选)
    当前视图会显示所有评论,改成只展示当前商品的评论更合理:

    def get_context_data(self, **kwargs):
        context = super().get_context_data()
        products = Product.objects.all()[:4]
        context['products'] = products
        product = self.get_object()  # 用DetailView自带方法获取当前商品,无需重复查slug
        context['title'] = product.title
        context['comment_form'] = CommentForm()
        # 只查询当前商品的评论
        context['comments'] = Comment.objects.filter(product=product)
        return context
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:35:25