2012-08-24 3 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 필드를 수강 할 자격이있다 두 점수, 내가 어떻게 해야할지. hange 점수 그래서 투표를 구현할 수있는 최대 투표에 기능을 아래로 투표, 나는 기존 점수와 투표에 아래로 투표를 뺄 수 있어야합니다, 도와주세요, 사전에 감사를 추가 할 수 있어야합니다장고 등급 앱 부정적인 점수

+0

RatingField는 (는) 사용자 정의 필드입니까? – 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 : Y]로 변환하면 디스플레이에 사용할 간격을로 [-x + X : Y + X] 당신의 코드에 이 문제를 피하십시오. [-5 : 5]를 원한다면 [-5 + 5 : 5 + 5] [0:10]을 사용하십시오. [-50 : 50 : 100 + 50] = [0 : 150] 등등을 사용하면 [-50 : 100]을 원한다면 ... 프로그래머에게는 문제가되지 않는 간단한 공식입니다.

긴 대답 : 당신이 포크 djangoratings 중 하나를 부정적 등급을 활성화하는 설정을 추가하는 중 하나를 열어 ... 그리고 아마 그는 그것을 거부 할 것입니다, 왜냐하면 간단한 간격 변환 해결 방법 때문에 여기에 좀 더 구체적인 예가 있습니다 : ambience_rating 경우

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 

그래서, "1"(가장 낮은 점수), get_adjusted_ambiance_rating() 반환합니다 -2. ambience_rating이 get_ambiance_rating_with_negative "5"(최고 점수) 인 경우

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

more details about template filters.

+0

감사합니다. 그러나 투표를하고 싶습니다. 사용자가 투표를 거부하거나 부정적인 투표를해야합니다. – Abhimanyu

+0

쉬운 일 : 투표 super 다운 -> 1, 다운 투표 -> 2, 중립 -> 3, 투표 -> 4, 투표 최고 -> 5. 코드에서 1-5 범위를 유지하지만 템플릿에서 변환 된 값을 사용하십시오 ... 이해 하겠니? – jpic

+0

답변을 드릴 기술적 세부 사항을 추가했습니다. – jpic