根据产品django过滤评论



我希望我对特定产品的评论只显示在该产品上,而不是显示在任何其他产品上。我不知道如何过滤它。最近它显示了所有产品的评论

我的<<p> strong> models.py 文件:
class Review(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
product = models.ForeignKey(Product , on_delete=models.CASCADE, null=True)
date = models.DateTimeField(auto_now_add=True)
text = models.TextField(max_length=3000 , blank=True)
rate = models.PositiveSmallIntegerField(choices=RATE_CHOICES)
likes= models.PositiveIntegerField(default=0)
dislikes = models.PositiveIntegerField(default=0)
def __str__(self):
return self.user.full_name

my productmodels.py是:

class Product(models.Model):
title = models.CharField(max_length=110)
slug = models.SlugField(blank=True, unique=True)
status = models.CharField(choices=CATEGORY_CHOICES, max_length=10)
price = models.DecimalField(decimal_places=2, max_digits=6)
quantity=models.IntegerField(default=1)
discount_price=models.FloatField(blank=True, null=True)
size = models.CharField(choices=SIZE_CHOICES, max_length=20)
color = models.CharField(max_length=20, blank=True, null=True)
image = models.ImageField(upload_to=upload_image_path)
description = RichTextField(max_length=1000)
featured = models.BooleanField(default=False)
author = models.ForeignKey(User, on_delete=models.CASCADE)
time_stamp = models.DateTimeField(auto_now_add=True)

myproduct detail views.py是:

class ProductDetailSlugView(ObjectViewedMixin,DetailView):
queryset = Product.objects.all()
context_object_name = "object_list"
template_name = "product_detail.html"
def get_context_data(self, *args ,**kwargs):
context = super(ProductDetailSlugView , self).get_context_data(*args, **kwargs)
context['reviews'] = Review.objects.all()
# context['reviews'] = Review.objects.filter(product=self.request.product)
cart_obj, new_obj = Cart.objects.new_or_get(self.request)
context['cart'] = cart_obj
# context['comments'] = Comment.objects.all()
return context

my product_detail.html is:

<!--                            {% for review in reviews %}-->when i do this with my code it show me all the product
<!--                            <h1>{{review.text}}{{review.rate}}</h1>-->
<!--                            {% endfor %}-->
{% for review in product.review_set.all %}
{{ review.text }}
{% endfor %}

您不需要为您的评论单独进行查询。您可以使用模板中的Product实例简单地循环遍历它们。另外,由于某些原因,您设置了context_object_name = "object_list",请试试:

{% for review in object.review_set.all %}
{{ review.text }}
{% endfor %}

这里的review_set是Django设置的默认的related_name,它是相关的模型名,小写加上_set。你可以选择自己设置相关的名称,如下所示:

product = models.ForeignKey(Product, related_name='reviews', on_delete=models.CASCADE, null=True)

无论如何,如果你坚持要修改视图,你可以这样做:

class ProductDetailSlugView(ObjectViewedMixin,DetailView):
queryset = Product.objects.all()
context_object_name = "object_list"
template_name = "product_detail.html"

def get_context_data(self, *args ,**kwargs):
context = super(ProductDetailSlugView , self).get_context_data(*args, **kwargs)
context['reviews'] = Review.objects.filter(product=self.object)
cart_obj, new_obj = Cart.objects.new_or_get(self.request)
context['cart'] = cart_obj
# context['comments'] = Comment.objects.all()
return context

然后你可以这样写:

{% for review in reviews %}
{{ review.text }}
{% endfor %}

最新更新