1

模型.py

class Restaurant(models.Model)
    food_rating = RatingField(range=2, weight=5,can_change_vote = True,allow_delete = True,allow_anonymous = True)
    service_rating = RatingField(range=2, weight=5,can_change_vote = True,allow_delete = True,allow_anonymous = True)
    ambience_ratiing = RatingField(range=2, weight=5,can_change_vote = True,allow_delete = True,allow_anonymous = True)

查看.py代码

r = Restaurant.objects.get(pk=1)
r.food_rating.add(score = -1 , user = request.user , ip_address =request.META.get('HTTP_REFERER'))
print r.food_rating.score

错误

djangoratings.exceptions.InvalidRating: -1 is not a valid choice for food_rating

怀疑

我的 food_rating 字段有资格获得两个分数,我应该如何更改分数以便我可以实现投票赞成和投票反对功能,在投票赞成时,我应该能够在现有分数上加 1,而在投票反对时我应该可以减去一票,请帮助,提前谢谢

4

1 回答 1

1

问题来自这个脚本

if score < 0 or score > self.field.range:
    raise InvalidRating("%s is not a valid choice for %s" % (score, self.field.name))

简短的回答:将要用于显示的 [-x:y] 间隔转换为代码中的 [-x+x:y+x] 以避免此问题。如果您想要 [-5:5],请使用 [-5+5:5+5],即 [0:10]。如果你想要 [-50:100] 然后使用 [-50+50:100+50] = [0:150] 等等......这是一个简单的公式,对于程序员来说应该不是问题;)

长答案:要么你分叉 djangoratings,要么你打开一个问题,要求添加一个启用负面评级的设置......他可能会拒绝它,因为简单的间隔转换解决方法,这里有一些更具体的例子:

class Restaurant(models.Model):
    # blabla :)

    ambience_rating = RatingField(range=5, weight=5,can_change_vote = True,allow_delete = True,allow_anonymous = True)

    def get_adjusted_ambiance_rating(self):
        return self.ambience_rating - 3

因此,如果 ambience_rating 为“1”(最低分数),get_adjusted_ambiance_rating() 将返回 -2。

如果 ambience_rating 为“5”(最高分),get_ambiance_rating_with_negative() 将返回 2。

根据您的需要调整此示例/技巧。

您可能应该为所有评级创建一个方法:

def get_adjusted_rating(self, which):
    return getattr(self, '%s_rating' % which) - 3

可以这样调用:

restaurant.get_adjusted_rating('ambiance')
restaurant.get_adjusted_rating('food')

# etc ...

也许是一个模板过滤器:

@register.filter
def get_adjusted_rating(restaurant, which):
    return restaurant.get_adjusted_rating(which)

可以这样使用:

{{ restaurant|get_adjusted_rating:"ambiance" }}
{{ restaurant|get_adjusted_rating:"food" }}

{# etc, etc #}

有关模板过滤器的更多详细信息。

于 2012-08-24T16:59:33.927 回答