Django的通用评级
django-ratings的Python项目详细描述
通用评级模块。出于优化原因,字段本身会在模型上附加两个附加字段。它添加了<field>_score和<field>_votes字段,这两个字段都是整型字段。
安装
您需要将djangoratings添加到INSTALLED_APPS:
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'djangoratings', )
最后,在应用程序的目录中运行python manage.py syncdb来创建表。
设置您的模型
Django Ratings的构建方式要求您将RatingField附加到模型。此字段将创建两列,一个投票列和一个得分列。它们都将以您的域名作为前缀:
from djangoratings.fields import RatingField class MyModel(models.Model): rating = RatingField(range=5) # 5 possible rating values, 1-5
或者,您可以执行如下操作:
from djangoratings.fields import AnonymousRatingField class MyModel(models.Model): rating = AnonymousRatingField(range=10)
如果您想使用内置的权重方法,使对象看起来更困难 要获得更高的评分,可以使用weightkwarg:
class MyModel(models.Model): rating = RatingField(range=10, weight=10)
RatingField允许下列选项:
- range = 2-接受值的范围。例如,范围为2,表示有2个可能的投票得分。
- can_change_vote = False-允许修改已进行的投票。
- allow_anonymous = False-是否允许匿名投票。
- use_cookies = False-使用cookies验证用户投票。仅当allow_anonymous = True时有效。
使用模型API
增加投票也很简单:
myinstance.rating.add(score=1, user=request.user, ip_address=request.META['REMOTE_ADDR'], request.COOKIES) # last param is optional - only if you use COOKIES-auth
检索投票也同样简单:
myinstance.rating.get_rating_for_user(request.user, request.META['REMOTE_ADDR'], request.COOKIES) # last param is optional - only if you use COOKIES-auth
^ {EM1}$$ eNe>您还可以删除现有的投票(如果启用删除):
myinstance.rating.delete(request.user, request.META['REMOTE_ADDR'], request.COOKIES) # last param is optional - only if you use COOKIES-auth
访问有关对象评级的信息也很容易:
# these do not hit the database myinstance.rating.votes myinstance.rating.score
如何使用算法按最高等级排序(示例来自nibbits.com源代码):
# In this example, ``rating`` is the attribute name for your ``RatingField`` qs = qs.extra(select={ 'rating': '((100/%s*rating_score/(rating_votes+%s))+100)/2' % (MyModel.rating.range, MyModel.rating.weight) }) qs = qs.order_by('-rating')
按比例[0-范围]获得实例的总体评分:
myinstance.rating.get_rating()
获取您的实例的最新评级:
# This returns ``Vote`` instances. myinstance.rating.get_ratings()[0:5]
获得选民的支持百分比:
myinstance.rating.get_percent()
得到相同的百分比,但不包括您的weight:
myinstance.rating.get_real_percent()
通用视图:处理投票
使用泛型视图的最佳方法是扩展它,或在您自己的代码中调用它:
from djangoratings.views import AddRatingFromModel urlpatterns = patterns('', url(r'rate-my-post/(?P<object_id>\d+)/(?P<score>\d+)/', AddRatingFromModel(), { 'app_label': 'blogs', 'model': 'post', 'field_name': 'rating', }), )
另一个例子,在nibbits上,我们使用一个基本的api接口,我们只需在自己的视图中调用AddRatingView:
from djangoratings.views import AddRatingView # For the sake of this actually looking like documentation: params = { 'content_type_id': 23, 'object_id': 34, 'field_name': 'ratings', # this should match the field name defined in your model 'score': 1, # the score value they're sending } response = AddRatingView()(request, **params) if response.status_code == 200: if response.content == 'Vote recorded.': request.user.add_xp(settings.XP_BONUSES['submit-rating']) return {'message': response.content, 'score': params['score']} return {'error': 9, 'message': response.content}
限制每个IP地址的投票
new in 0.3.5:现在有一个设置RATINGS_VOTES_PER_IP,用于限制每个对象/分级字段组合的唯一IP数。如果用户注册多个帐户以对单个对象进行投票时遇到问题,则此功能非常有用:
RATINGS_VOTES_PER_IP = 3