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

