Джанго рейтинговое приложение, отрицательная оценка

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 #}

Подробнее о фильтрах шаблонов.

Другие вопросы по тегам