Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在模板中引用函数的结果?德扬戈_Python_Django_Django Models_Django Templates_Django Views - Fatal编程技术网

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'
。这也应该防止重复条目。