Django匿名投票应用程序。
项目描述
django-secretballot
Django投票应用程序,允许未登录用户进行投票。
提供用户希望允许投票的类型的抽象基类模型,以及相关的实用程序,包括通用视图,以简化将“匿名”投票添加到Django项目的操作。
由Basil Shubin维护,以及一些优秀的贡献者。
安装
首先安装模块,最好在虚拟环境中。它可以从PyPI安装
pip install django-secretballot
设置
首先,您必须将此项目添加到settings.py中的INSTALLED_APPS列表
INSTALLED_APPS += [
"secretballot",
]
在settings.py中,您需要设置一个唯一的配置选项
# In order to attach the voting helpers to a particular model it is enough
# to list them here...
SECRETBALLOT_FOR_MODELS = {
"<app_label.model_name>": {},
}
运行./manage.py migrate。这将在您的数据库中创建必要的表以进行操作。
请参阅示例应用程序。此应用程序用于手动测试此包的功能。这也提供了一个很好的示例。
运行此应用程序需要Django 1.8或更高版本。它可能在旧版本上运行,但未经测试。
使用投票启用的模型
一旦模型启用了投票,所有实例都将具有一些特殊字段
字段
可投票对象具有以下字段
votes
管理当前模型所有相关Vote对象的管理器(通常不需要直接访问)。可以通过将votes_name参数传递给SECRETBALLOT_FOR_MODELS来重命名,例如
SECRETBALLOT_FOR_MODELS = {
"<app_label.model_name>": {
"votes_name": "vs",
},
}
total_upvotes
所有+1票的总数。可以通过将upvotes_name参数传递给SECRETBALLOT_FOR_MODELS来重命名,例如
SECRETBALLOT_FOR_MODELS = {
"<app_label.model_name>": {
"upvotes_name": "total_upvs",
},
}
total_downvotes
所有-1票的总数。可以通过将downvotes_name参数传递给SECRETBALLOT_FOR_MODELS来重命名,例如
SECRETBALLOT_FOR_MODELS = {
"<app_label.model_name>": {
"downvotes_name": "total_downvs",
},
}
vote_total
(total_upvotes减去total_downvotes)的快捷访问器。可以通过将total_name参数传递给SECRETBALLOT_FOR_MODELS来重命名,例如
SECRETBALLOT_FOR_MODELS = {
"<app_label.model_name>": {
"total_name": "v_total",
},
}
_secretballot_enabled
表示secretballot是否启用(可以使用hasattr进行测试)的布尔值。不能重命名,存在是为了在所有其他字段都已重命名的情况下,仍然可以可靠地检查secretballot是否可用。
方法
可投票对象具有以下自定义方法
add_vote
一个函数,它接受一个token和一个投票(+1或-1),并添加或更新指定token的投票。可以通过将add_vote_name参数传递给SECRETBALLOT_FOR_MODELS来重命名,例如
SECRETBALLOT_FOR_MODELS = {
"<app_label.model_name>": {
"add_vote_name": "add_v",
},
}
remove_vote
一个函数,它接受一个token并移除(如果存在)指定token的投票。可以通过将remove_vote_name参数传递给SECRETBALLOT_FOR_MODELS来重命名,例如
SECRETBALLOT_FOR_MODELS = {
"<app_label.model_name>": {
"remove_vote_name": "remove_v",
},
}
管理器函数
添加了一个特殊的管理器,该管理器可以包含total_upvotes和total_downvotes以及一些额外功能。
默认情况下,此管理器替换了objects管理器,但可以通过将manager_name参数传递给SECRETBALLOT_FOR_MODELS来更改此行为,例如
SECRETBALLOT_FOR_MODELS = {
"<app_label.model_name>": {
"manager_name": "ballot_custom_manager",
},
}
在可投票管理器上还有一个额外的方法
from_request(self, request)
当在可投票对象的查询集中调用时,将添加一个user_vote属性,该属性是当前‘用户’投的票(实际上是分配给请求的token),例如
def story_view(request, slug):
story = Story.objects.from_request(request).get(pk=slug)
# story has the following extra attributes
# user_vote: -1, 0, or +1
# total_upvotes: total number of +1 votes
# total_downvotes: total number of -1 votes
# vote_total: total_upvotes-total_downvotes
# votes: related object manager to get specific votes (rarely needed)
令牌和SecretBallotMiddleware
在没有用户登录的情况下,无法确定用户是否不会多次投票,但有一些方法可以限制滥用。secretballot对这个问题采取了相当宽松的态度,Vote对象有一个用于存储从请求生成的唯一标识令牌的token字段。为了限制来自特定IP地址的投票数量,可以将令牌设置为IP地址,但也可以开发更复杂的方法来限制投票者。
secretballot使用一个简单的中间件来完成这项任务,并使用户能够轻松定义自己的中间件,以便使用他们需要的任何启发式方法。
SecretBallotMiddleware是一个抽象类,它定义了一个generate_token(request)方法,该方法应返回用于令牌的字符串。
为了方便,已经定义了几个中间件
SecretBallotIpMiddleware
简单地将token设置为request.META['REMOTE_ADDR'] – 用户IP地址
SecretBallotIpUseragentMiddleware
将token设置为用户IP地址和用户代理的哈希值 – 比仅IP地址稍微更独特
如果您想定义自己的中间件,只需从SecretBallotMiddleware派生一个类并实现generate_token方法。如果您想出一些可能对他人有用的东西,贡献始终欢迎。
通用视图
secretballot.views包括以下通用视图
secretballot.views.vote
描述
此视图创建或更改具有content_type的具有主键object_id的对象的投票。如果已存在投票,则将其替换(除非投票为0,在这种情况下将删除投票)。
用于防止无限投票的投票的token属性在此视图中设置,基于活动的SecretBallotMiddleware。
根据提供的参数,此视图的返回值可能会有所不同
如果指定了redirect_url,则无论什么情况都会使用它
如果指定了template_name,则将使用它(以及template_loader、context_processors等)
如果没有redirect_url或template_name,则返回文本/json响应
必需参数
content_type:投票发生的类(一个从VotableModel派生的模型)。
可以是django.contrib.contenttypes.models.ContentType的实例、模型类本身或<app_label.model_name>字符串。
object_id:要投票的对象的主键
vote:此投票的值(+1、0或-1)(0删除投票)
可选参数
can_vote_test:允许限制用户是否可以投票的函数。它是视图的可选参数,可以在记录用户的投票之前在urlconf中指定。
can_vote_test的示例实现
from secretballot.utils import get_vote_model def only_three_votes(request, content_type, object_id, vote): return get_vote_model().objects.filter(content_type=content_type, token=request.secretballot_token).count() < 3
所有can_vote_test方法都必须接受secretballot.views.vote的非可选参数,并且如果应允许投票,则应返回True。如果默认不允许投票,则视图将返回403,但也可以引发不同的异常。
redirect_url:要重定向到的URL,如果存在,将重定向而不是返回正常的HttpResponse
template_name:要渲染的模板,接收一个包含content_obj的上下文,它是被投票的对象
template_loader:要使用的模板加载器,默认为django.template.loader
extra_context:包含任何额外上下文的字典,在渲染时将调用可调用对象
context_processors:此视图的上下文处理程序列表
mimetype:mimetype覆盖
致谢
django-secretballot最初由James Turk启动,但他不幸放弃了该项目。
许可证
django-secretballot在BSD许可证下发布。
更改
2.0.0 (2021-10-26)
删除与Django 1.10及以下版本的兼容性代码
使项目可以自定义投票模型
1.0.0 (2017-12-05)
支持Django 1.8及以上的最终版本
0.7.1 (2017-10-03)
改进了对Django 2.0的支持
0.7.0 (2017-05-05)
增强对Django 1.11的支持
0.6.0 (2016-10-07)
支持Django 1.10的新管理规则
添加迁移
修复对象未通过正确的管理器获取的情况
0.5.0 (2015-11-02)
取消South支持
取消对Django < 1.8的支持,添加对Django 1.9的支持
0.4.0 (2015-05-27)
取消South支持
取消对Django < 1.7的支持,添加对Django >= 1.7的支持
添加Python 3支持
添加大量测试
修复在enable_voting_on中设置vote_name时的bug
0.3.0 (2015-04-17)
从François Chapuis修复related_fields和get_object_or_404
添加属性以检查类上是否存在secretballot
通过Simon de Han添加到投票中的索引时间戳
通过Dan Drinkard使响应有效JSON以实现mimetype兼容性
0.2.3 (2010-03-30)
感谢Gennadiy Potapov的bug修复
0.2.2 (2009-11-27)
修复vote中的尴尬的SyntaxError
0.2.1 (2009-11-24)
修复0.1版本遗留的一些文档问题
使content_type更灵活(现在可以接受模型、content_type或‘app.model’字符串)
0.2.0 (2009-02-11)
用enable_voting_on替换VotableObject的继承
注入管理方法时继承现有管理器
0.1.0 (2009-01-24)
初始工作版本
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。