怎么办我在模板中引用函数的结果? Django的

时间:2016-03-11 09:40:36

标签: python django django-models django-templates django-views

我有这些模特:

# this is model for user
class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name='profile')

    profilepic = models.ImageField(blank=True)


    city = models.ForeignKey(City)
    slug = models.SlugField(unique=True)


    def save(self, *args, **kwargs):
        self.slug = slugify(self.user.username)
        super(UserProfile, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.user.username

    @property
    def avg_rating(User):
        return UserProfile.userrating_set.all().aggregate(Avg('rating'))['rating__avg']


# this is the model for user ratings - one to many relationship with User
class UserRating(models.Model):
    user = models.ForeignKey(User)
    comment = models.CharField(max_length=500)
    for_username = models.CharField(max_length=128)
    rating = models.IntegerField(default=5)

    def __unicode__(self):
        return unicode(self.rating)

我想在模板中引用属性(avg_rating)的结果,这样我就可以显示每个用户的评分。我试过这个它显示空白结果:

{% for user in users %}
{{ user.profile.avg_rating }}

此外,这是被调用的视图:

def index(request):
    user_list = User.objects.select_related().order_by('-userrating')[:5]

    city_list = City.objects.order_by('-name')[:5]

    context_dict = {"users": user_list, "cities" : city_list}

    return render(request, "index.html", context_dict)

我目前正在通过Django学习,对不起,如果非常明显的话。

3 个答案:

答案 0 :(得分:3)

User的{​​{1}}参数根本没用过。尝试将其重写为:

avg_rating

你也可以删除def avg_rating(self): return self.user.userrating_set.all().aggregate(Avg('rating'))['rating__avg'] 装饰器,因为你也可以使用相同的语法(即没有@property)在Django模板中使用方法,例如:

()

答案 1 :(得分:2)

UserRating与User相关,而不是UserProfile。您需要针对该模型进行查询。

但请注意,由于需要为每个用户提供额外的查询+聚合,因此您执行此操作的方式非常昂贵。相反,您应该通过适用于查询集中所有元素的annotation方法在视图中执行查询。

def index(request):
    user_list = User.objects.select_related().annotate(
        rating=Avg('userrating__rating')
    ).order_by('-rating')[:5]

现在,您可以通过模板中的{{ user.rating }}来引用每个用户的评分。

答案 2 :(得分:0)

1) def avg_rating之类的东西喜欢设置为Manager方法。为UserProfile(例如UserProfileManager)创建Manager类以处理UserProfile模型的所有查询可能更好。 avg_rating定义更倾向于使用此UserProfileManager。

2) avg_rating定义与UserProfile有关,因此它应该作为UserProfile方法调用而不是User方法。

3) 在为User rating创建UserRating类时,在UserProfile类中设置avg_rating可能会造成混淆。