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フィールドは2つのスコアを取得する資格があります。どのようにスコアを変更して、投票アップと投票ダウン機能を実装できるようにするのですか。投票すると、既存のスコアに1を追加でき、投票すると、i投票を差し引くことができるはずです、助けてください、事前に感謝します

4

1 に答える 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]が必要な場合は、[-0:10]である[-5 + 5:5+5]を使用します。[-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 #}

テンプレートフィルターの詳細。

于 2012-08-24T16:59:33.927 に答える