models.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)
view.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,在向下投票时我应该能够减去一个投票,请帮忙,提前感谢
问题来自这个脚本:
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],依此类推。。。这是一个简单的公式,对程序员来说应该不是问题;)
长话短说:要么你分叉djangoraratings,要么你打开一个问题,要求添加一个启用负面评级的设置。。。他可能会拒绝它,因为有一个简单的区间转换方法,这里有一些更具体的例子:
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
因此,如果ambient_rating为"1"(最低分数),则get_adjusted_ambiance_rating()将返回-2。
如果ambient_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 #}
有关模板筛选器的更多详细信息。