首页 > 解决方案 > 如何在产品评论中显示评分

问题描述

我的模型:

class Comment(models.Model):
    product = models.ForeignKey(Product ,on_delete=models.CASCADE, related_name='comments')
    user = models.ForeignKey(User ,on_delete=models.CASCADE, max_length=80, related_name='comments_user')
    body = models.TextField()
    created_on = jmodels.jDateField(auto_now_add=True)
    created_on_time = models.TimeField(auto_now_add=True,null=True)
    active = models.BooleanField(default=False)

    class Meta:
        ordering = ['created_on'] 

    def __str__(self):
        return 'Comment {} by {}'.format(self.body, self.user)

class Rating(models.Model):
    product = models.ForeignKey(Product ,on_delete=models.CASCADE)
    user = models.ForeignKey(User ,on_delete=models.CASCADE)
    score = models.IntegerField(default=0,
        validators=[
            MaxValueValidator(5),
            MinValueValidator(0),
        ]
    )

    def __str__(self):
        return 'rate {} by {} for {}'.format(self.score, self.user, self.product)
 

在产品单页中,我有评论部分,如果该用户在用户名和评论日期的旁边放置评论,我想显示用户评分。

我的看法:

def product_details(request, category_url, subcategory_url, product_url):
    product = get_object_or_404(Product, product_url=product_url)
    stocks = Stock.objects.filter(product=product)
    rate = Rating.objects.filter(product=product, user=request.user)
    all_rates = Rating.objects.filter(product=product)
    all_rate_count = Rating.objects.filter(product=product).count()
    all_rate = sum([all_rate.score for all_rate in all_rates])
    all_rate = all_rate/all_rate_count
    all_rate = all_rate*100/5
    comments = product.comments.filter(product=product, active=True)
    if request.method == "POST":
        body = request.POST['body']
        new_comment = Comment(user=request.user,product=product, body=body)
        new_comment.save()
        message_good = "نظر شما با موفقیت ثبت شد بعد از برسی نمایش داده میشود!"
        ctx = {'product':product, 'stocks':stocks, 'rate':rate, 'all_rate':all_rate,
            'comments':comments,
            'message_good':message_good,
            'all_rate_count':all_rate_count}
        return render(request, 'products/product_details.html', ctx)
    ctx = {'product':product, 'stocks':stocks, 'rate':rate, 'all_rate':all_rate,
     'comments':comments,
     'all_rate_count':all_rate_count}
    return render(request, 'products/product_details.html', ctx)

我的 html :

{% for comment in comments %}
<div class="comments" style="padding: 10px;">
  <p class="font-weight-bold">
    {{ comment.user }}
    <span class=" text-muted font-weight-normal">
      {{ comment.created_on }}
    </span>
    <span class=" text-muted font-weight-normal">
      {{ comment.created_on_time|date:"G:i" }}
    </span>
  </p>
  {{ comment.body | linebreaks }}
</div>
{% endfor %}

我更新了我的代码,并显示了我的观点和我的单个 html,所以如果可以帮助我按用户显示用户过滤的每条评论的产品率。或对有关评级或显示单个产品页面评论的其他方式的任何更好的建议。谢谢你的帮助

标签: djangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


我会添加一个unique_together约束来强制用户只能为产品留下一个评分。

class Rating(models.Model):
    product = models.ForeignKey(Product ,on_delete=models.CASCADE)
    user = models.ForeignKey(User ,on_delete=models.CASCADE)
    score = models.IntegerField(default=0,
        validators=[
            MaxValueValidator(5),
            MinValueValidator(0),
        ]
    )

  class Meta:
    unique_together = ('product', 'user')

    def __str__(self):
        return 'rate {} by {} for {}'.format(self.score, self.user, self.product)

在您看来,因为您对每个用户的产品只有一个评分。

rate = Rating.objects.get(product=product, user=request.user)

在您的模板中:

{% for comment in comments %}
<div class="comments" style="padding: 10px;">
  <p class="font-weight-bold">
    {{ comment.user }}
    <span class=" text-muted font-weight-normal">
      {{ comment.created_on }}
    </span>
    <span class=" text-muted font-weight-normal">
      {{ comment.created_on_time|date:"G:i" }}
    </span>
  </p>
  {{ comment.body | linebreaks }}

  {{ rate.score }}
</div>
{% endfor %}

推荐阅读