簡體   English   中英

如何在 django 中對產品進行星級評分,如何將其存儲在 model 中並將其呈現為模板?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM