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-允许修改已进行的投票。
  • ^ TT10}$-允许删除现有选票。仅当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

^ {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

模板标记

现在django ratings对模板标记的支持有限,而且只支持django。

按请求评分

检索用户对特定对象的Vote强制转换,并 将其存储在上下文变量中。如果用户没有投票, 上下文变量将为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设置中。

用户评分

建议您使用按请求分级,因为您将获得完全支持 如果启用了匿名用户,则适用于他们

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

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

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何通过解决错误“活动无法转换为片段”将片段传递给类构造函数?   Java中清理Code39条码数据的regex帮助   将java转换为C++   java无法在Android Studio中生成签名的apk,出现错误   从数学方程出发   MySQL和Java内存问题   如何强制Java抛出算术异常?   java为什么JDBC将零端口视为空(默认)端口?   java如何在没有“changelog主题”的情况下加入KStream和KTable   排序我尝试合并两个排序的数组,但得到的是java。lang.ArrayIndexOutofBounds异常:5无法找出原因   如何在java中求大长度矩阵的逆?   基于maven构建的java生成类路径字符串   java每20个字符分割一个字符串,然后将每个部分打印到控制台   将字符串数字字转换为字符串数字:Java   在特定区域使用混合类型的java填充字节数组   尽管java类在开关块中实例化,但它只能调用接口方法