2012-08-24 2 views
1

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

+0

Является ли Рейтинговое поле настраиваемым полем? – Dave

+0

Я использую приложение djangoratings, https://github.com/dcramer/django-ratings – Abhimanyu

ответ

1

проблема возникает из this script:

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

Короткий ответ: преобразование [-x: у] интервал, который вы хотите использовать для отображения, в [х + х: у + х] в коде избегайте этой проблемы. Если вы хотите [-5: 5], используйте [-5 + 5: 5 + 5], который равен [0:10]. Если вы хотите [-50: 100], используйте [-50 + 50: 100 + 50] = [0: 150] и т. Д. Это простая формула, которая не должна быть проблемой для программиста;)

Долгий ответ: либо вы, либо dkangoratings fork, либо вы открываете вопрос с просьбой добавить параметр, позволяющий отрицательные оценки ... и, вероятно, он отклонит его, из-за простого обхода временного интервала, вот еще несколько конкретных примеров:

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 

Callable как таковой:

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

Подробнее details about template filters.

+0

спасибо, но я хотел проголосовать, как в, пользователь должен иметь возможность проголосовать отрицательно или проголосовать отрицательно – Abhimanyu

+0

Легко, сделайте вот так: vote super down -> 1, проголосовать вниз -> 2, голосовать нейтрально -> 3, проголосовать -> 4, голосовать супер -> 5. Сохранять диапазон 1-5 в вашем коде, но в шаблонах использовать преобразованное значение ... Вы понимаете ? – jpic

+0

Добавлены технические детали для ответа. – jpic