[英]How can I take star rating of product in django and how can I store it in model and render it to template?
我的 model 中有兩個 class ,這兩個模型是:
from django.db import models
from accounts.models import *
from django.core.validators import MinValueValidator, MaxValueValidator
# Create your models here.
class Products(models.Model):
name = models.CharField(max_length=50)
img = models.ImageField(upload_to='productImage')
CATEGORY = (
('Snacks','Snacks'),
('Juice','Juice'),
)
category = models.CharField(max_length=50, choices=CATEGORY)
description = models.TextField()
price = models.FloatField()
review = models.TextField()
def no_of_rating(self):
rating = Rating.objects.filter(product=self)
return len(rating)
def avg_rating(self):
sum = 0
ratings = Rating.objects.filter(self)
for rating in ratings:
sum += rating
if len(ratings>0):
return sum//len(rating)
else:
return 0
rating = avg_rating(self) # This Line did not work for me
def __str__(self):
return self.name
class Rating(models.Model):
product = models.ForeignKey(Products, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
stars = models.IntegerField(validators=[MinValueValidator(1),MaxValueValidator(5)])
def __str__(self):
return str(self.product)+"---"+str(self.user)
# Views Code
def products(request):
product = Products.objects.all()
content = {
'Products':product,
}
return render(request,'products.html',content)
#Template Code
{% for product in Products %}
<div class="col-xs-12 col-md-6">
<!-- First product box start here-->
<div class="prod-info-main prod-wrap clearfix">
<div class="row">
<div class="col-md-5 col-sm-12 col-xs-12">
<div class="product-image">
<img src="{{product.img.url}}" class="img-responsive rotprod">
</div>
</div>
<div class="col-md-7 col-sm-12 col-xs-12">
<div class="product-deatil">
<h5 class="name">
<a href="#">
{{product.name}}
</a>
<br>
<a href="#">
<span>{{product.category}}</span> <br>
<span>{{product.avg_rating}}</span> <br>
</a>
</h5>
<p class="price-container">
<span>₹{{product.price}}</span>
</p>
<span class="tag1"></span>
</div>
<div class="description">
<p>{{product.description}}</p>
</div>
<div class="product-info smart-form">
<div class="row">
<div class="col-md-12">
<a href="javascript:void(0);" class="btn btn-danger btn-cart"><span>Add to cart</span></a>
<a href="javascript:void(0);" class="btn btn-info"><span>More info</span></a>
</div>
<!--
<div class="col-md-12">
<div class="rating">Rating:
<label for="stars-rating-5"><i class="fa fa-star text-danger"></i></label>
<label for="stars-rating-4"><i class="fa fa-star text-danger"></i></label>
<label for="stars-rating-3"><i class="fa fa-star text-danger"></i></label>
<label for="stars-rating-2"><i class="fa fa-star text-warning"></i></label>
<label for="stars-rating-1"><i class="fa fa-star text-warning"></i></label>
</div>
</div>
-->
</div>
</div>
</div>
</div>
</div>
<!-- end product -->
</div>
{% endfor %}
我想將產品的平均評分存儲在產品模型/表中,我該如何執行此操作,因為我無法通過調用 function 來通過我的代碼手動執行此操作。 如何在產品模塊中存儲每個產品的平均值。
當我試圖通過直接調用該產品 model 的方法來解決它時,我收到以下錯誤:“TypeError at /products 'Products' object is not iterable”
from django.db import models
from accounts.models import *
from django.core.validators import MinValueValidator, MaxValueValidator
from django.db.models import Avg
class Products(models.Model):
name = models.CharField(max_length=50)
img = models.ImageField(upload_to='productImage')
CATEGORY = (
('Snacks','Snacks'),
('Juice','Juice'),
)
category = models.CharField(max_length=50, choices=CATEGORY)
description = models.TextField()
price = models.FloatField()
review = models.TextField()
@property
def no_of_ratings(self):
sum=0
ratings = Rating.objects.filter(product=self)
return len(ratings)
@property
def avg_rating(self):
sum=0
ratings = Rating.objects.filter(product=self)
for rating in ratings:
sum=sum+rating.stars
if len(ratings)>0:
return sum/len(ratings)
else:
return 0
def __str__(self):
return self.name
class Rating(models.Model):
product = models.ForeignKey(Products, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
stars = models.IntegerField(validators=[MinValueValidator(1),MaxValueValidator(5)])
def __str__(self):
return str(self.product)+"---"+str(self.user)
這段代碼對我有用,謝謝大家的幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.