Джанго рейтинговое приложение, отрицательная оценка
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 к существующему счету и при голосовании вниз, я должны быть в состоянии вычесть голос, пожалуйста, помогите, заранее спасибо
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 #}
Подробнее о фильтрах шаблонов.