Python 如何在模板中引用函数的结果?德扬戈
我有这些模型:Python 如何在模板中引用函数的结果?德扬戈,python,django,django-models,django-templates,django-views,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=Tr
# 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_评级)的结果,以便显示每个用户的评级。我试过这个,它显示空白结果:
{% 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学习我的方法,如果这很明显,很抱歉。您的
avg\u评级的User
参数根本没有使用。尝试将其改写为:
def avg_rating(self):
return self.user.userrating_set.all().aggregate(Avg('rating'))['rating__avg']
您还可以删除@property
装饰器,因为您也可以在Django模板中使用使用相同语法的方法(即不使用()
),例如:
{{ user.profile.avg_rating }}
UserRating与用户相关,而不是与UserProfile相关。您需要对该模型进行查询
但是请注意,由于每个用户都需要额外的查询+聚合,因此这样做的成本非常高。相反,您应该在视图中通过注释方法进行查询,该方法适用于查询集中的所有元素
def index(request):
user_list = User.objects.select_related().annotate(
rating=Avg('userrating__rating')
).order_by('-rating')[:5]
现在,您可以通过模板中的{{user.rating}}
引用每个用户的评级。1)
像def avg_评级这样的东西需要设置为Manager方法。最好为UserProfile创建Manager类(例如UserProfileManager),以处理UserProfile模型的所有查询。avg_评级定义更倾向于使用此UserProfileManager
(二)
avg_评级定义与UserProfile相关,因此应将其作为UserProfile方法而不是User方法调用
(三)
在UserProfile类中设置avg_rating可能会让人困惑,因为UserRating类是为评级内容创建的。正如Selcuk在他的回答中所说,问题在于avg_rating
属性。请注意,模板可以隐藏这样的错误。如果要添加新方法或属性,最好尝试在shell或视图中打印结果,然后您将看到错误消息,而不是无声的失败。很抱歉,我现在收到此错误:“UserProfile”对象没有“userrating_set”属性。我有Django的内置用户模型,它与UserProfile有一对一的关系,与UserRating有一对多的关系。我在测试页面后收到这个错误。未定义全局名称“userrating\uuuu rating”。我不知道为什么它不能识别用户等级。对不起,应该在引号中。现在试试。谢谢你的帮助。它现在显示了评分,但它们不是按平均值排序的(显示为:50、100、0、35),如果我给用户两个评分,它会显示两次,而不是计算平均值并将其放在正确的位置。要按平均评分排序,请按注释字段'-rating'
排序,而不是'-userrating'
。这也应该防止重复条目。