跳转到主要内容

Django中的通用评分

项目描述

一个通用的评分模块。出于优化原因,该字段本身在模型上附加了两个额外字段。它添加了 <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)

如果您想使用内置的加权方法,使对象获得更高的评分更困难,您可以使用 weight 参数

class MyModel(models.Model):
    rating = RatingField(range=10, weight=10)

RatingField 允许以下选项

  • range = 2 - 接受值的范围。例如,2 的范围表示有 2 个可能的投票评分。

  • can_change_vote = False - 允许修改已投的票。

  • allow_delete = False - 允许删除现有投票。仅在 can_change_vote = True 时有效

  • 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

新功能 您还可以删除现有的投票(如果启用了删除功能)

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

获取相同的百分比,但不包括您的权重

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地址的投票次数

0.3.5新增:现在有一个设置,RATINGS_VOTES_PER_IP,用于限制每个对象/评分字段组合的唯一IP数量。如果您有用户注册多个账户来对一个对象进行投票的问题,这将很有用。

RATINGS_VOTES_PER_IP = 3

模板标签

目前django-ratings对模板标签的支持有限,并且仅限于Django。

rating_by_request

检索用户对特定对象的投票,并将其存储在上下文变量中。如果用户没有投票,上下文变量将为0

{% rating_by_request request on instance.field as vote %}

如果您正在使用Coffin,可能更好的方法是这样的

{% with instance.field_name.get_rating_for_user(request.user, request.META['REMOTE_ADDR'], request.COOKIES) as vote %}
        Do some magic with {{ vote }}
{% endwith %}

要使用request上下文变量,您需要将django.core.context_processors.request添加到TEMPLATE_CONTEXT_PROCESSORS设置中。

rating_by_user

建议您使用rating_by_request,因为如果启用了匿名用户,您将获得完整的支持

检索用户对特定对象的投票,并将其存储在上下文变量中。如果用户没有投票,上下文变量将为0

{% rating_by_user user on instance.field as vote %}

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

django-ratings-0.3.7.tar.gz (16.8 kB 查看哈希值)

上传时间 源代码

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面