如何在django中以星星的形式显示平均评分

问题描述 投票:0回答:1

我想以星星的形式显示产品的平均评分,我想要 5 颗星,然后用金色填充星星,表示产品的平均评分是多少。 这是我的代码和我的关系黑白模型

class Product(models.Model):
name = models.CharField(max_length=300)
price = models.DecimalField(max_digits=7, decimal_places=2)
image_url = models.CharField(max_length=400)
digital = models.BooleanField(blank=False)
sizes =  models.ManyToManyField(Size, through='ProductSize')
quantity = models.IntegerField(default=1)

    def __str__(self):
       return self.name
    
    @property
    def get_average_rating(self):
    average = self.comment_set.aggregate(Avg('rating'))['rating__avg']
    if average is not None:
      return round(average, 1)
    else:
      return 0 



class Comment(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE)
   product = models.ForeignKey(Product, on_delete=models.CASCADE)
   text = models.TextField()
   image = models.ImageField(upload_to='images/comment_images', null=True, blank=True)
   created_on = models.DateField(auto_now_add=True)
   rating = models.IntegerField(default=0, validators=[MinValueValidator(0), MaxValueValidator(5)])

 


我尝试运行这样的循环,但它不起作用,因为平均评分是浮动的

我不太了解 javascript,所以如果你能在 js 方面帮助我,我也会很感激,谢谢!!

           {% for _ in product.get_average_rating %}
               ★
           {% endfor %}
javascript python python-3.x django jinja2
1个回答
0
投票

在模型中渲染它:

class Product(models.Model):
    name = models.CharField(max_length=300)
    price = models.DecimalField(max_digits=7, decimal_places=2)
    image_url = models.CharField(max_length=400)
    digital = models.BooleanField(blank=False)
    sizes = models.ManyToManyField(Size, through='ProductSize')
    quantity = models.IntegerField(default=1)

    def __str__(self):
        return self.name

    @property
    def average_rating(self):
        return round(
            self.comment_set.aggregate(Avg('rating'))['rating__avg'] or 0, 1
        )

    @property
    def star_rating(self):
        return '★' * self.average_rating

并渲染:

{{ 产品.star_ rating }}
© www.soinside.com 2019 - 2024. All rights reserved.