跳转到主要内容

Django通用投票应用程序

项目描述

Jazzband GitHub Actions Code coverage Supported Python versions Supported Django versions

这是一个通用的投票应用程序,适用于Django项目,允许为任何模型实例注册投票。

安装

  1. 安装django-voting软件包

  2. voting添加到你的INSTALLED_APPS

    INSTALLED_APPS = [
        …
        'voting',
        …
    ]
  3. 运行django-admin migrate

使用方法

投票

投票由位于voting.models模块中的Vote模型表示。

使用record_vote辅助函数来记录投票

>>> from django.contrib.auth.models import User
>>> from shop.apps.products.models import Widget
>>> from voting.models import Vote
>>> user = User.objects.get(pk=1)
>>> widget = Widget.objects.get(pk=1)
>>> Vote.objects.record_vote(widget, user, +1)

可以使用get_score辅助函数检索对象的分数

>>> Vote.objects.get_score(widget)
{'score': 1, 'num_votes': 1}

如果同一用户在相同对象上再次进行投票,其投票将根据需要修改或删除

>>> Vote.objects.record_vote(widget, user, -1)
>>> Vote.objects.get_score(widget)
{'score': -1, 'num_votes': 1}
>>> Vote.objects.record_vote(widget, user, 0)
>>> Vote.objects.get_score(widget)
{'score': 0, 'num_votes': 0}

字段

Vote对象有以下字段

  • user – 进行投票的用户。用户由django.contrib.auth.models.User模型表示。

  • content_type – 投票对象的ContentType。

  • object_id – 投票对象的id。

  • object – 投票的对象。

  • vote – 投票的内容:+1-1

方法

Vote对象有以下自定义方法

  • is_upvote – 如果投票为+1,则返回True

  • is_downvote – 如果投票为-1,则返回True

管理函数

Vote模型有一个自定义管理器,它具有以下辅助函数

  • record_vote(obj, user, vote) – 记录用户对指定对象的投票。只允许给定用户在指定对象上投票一次,但投票可以更改。

    vote必须是1(点赞)、-1(踩)或0(移除投票)之一。

  • get_score(obj) – 获取obj的总分数和收到的总投票数。

    返回一个包含scorenum_votes键的字典。

  • get_scores_in_bulk(objects) – 获取所有给定对象的分数和投票计数详情。分数详情由具有scorenum_vote键的字典组成。

    返回一个将对象id映射到分数详情的字典。

  • get_top(Model, limit=10, reversed=False) – 获取给定模型中分数最高的limit个对象。

    如果reversedTrue,则检索分数最低的limit个对象。

    产生(object, score)元组。

  • get_bottom(Model, limit=10) – 这是一个便利方法,它使用reversed=True调用get_top

    获取给定模型分数最低的(即最负面的)limit个对象。

    产生(object, score)元组。

  • get_for_user(obj, user) – 获取给定用户对指定对象的投票,如果不存在匹配的投票,则返回 None

  • get_for_user_in_bulk(objects, user) – 获取给定用户对所有指定对象的投票。

    返回一个将对象 ID 映射到投票的字典。

  • get_voted_users(object) – 获取对给定对象投票的所有用户。

    返回包含用户 ID 的对象列表。

通用视图

voting.views 模块包含用于处理一些常见情况的视图:通过 GET 请求显示确认投票的页面,并通过 POST 请求进行投票,或者通过 XMLHttpRequest POST 投票。

以下示例 URLconf 展示了如何使用通用视图对模型进行投票,允许在同一 URL 上进行常规投票和 XMLHttpRequest 投票。

from django.urls import re_path
from voting.views import vote_on_object
from shop.apps.products.models import Widget

widget_kwargs = {
    'model': Widget,
    'template_object_name': 'widget',
    'allow_xmlhttprequest': True,
}

urlpatterns = [
    re_path(
        r"^widgets/(?P<object_id>\d+)/(?P<direction>up|down|clear)vote/?$",
        vote_on_object,
        kwargs=widget_kwargs,
    ),
]

voting.views.vote_on_object

描述

一个显示确认页面并对对象进行投票的视图。如果请求方法是 POST,则将只对给定对象进行投票。如果通过 GET 获取此视图,它将显示一个包含表单的确认页面,该表单将 POST 到同一 URL。

必需参数

  • model:将被投票的对象的 Django 模型类。

  • 必需提供 object_id 或 (slug slug_field)。

    如果您提供 object_id,它应该是被投票对象的主键字段的值。

    否则,slug 应该是给定对象的 slug,而 slug_field 应该是 QuerySet 模型中 slug 字段的名称。

  • direction:要进行的投票类型,必须是 'up''down''clear' 之一。

  • 必须提供定义 URL 的 post_vote_redirect 参数,或者在请求 POST 投票时提供包含 URL 的 next 参数,或者被投票的对象必须定义 get_absolute_url 方法或属性。

    视图将按上述顺序检查这些。

可选参数

  • allow_xmlhttprequest:一个布尔值,表示此视图是否还应允许通过 XMLHttpRequest 进行投票。

    如果这是 True,则将检查请求头中的 HTTP_X_REQUESTED_WITH 头,其值为 XMLHttpRequest。如果找到此头,则将当前请求的处理委托给 voting.views.xmlhttprequest_vote_on_object

  • template_name:用于渲染页面的模板的完整名称。这允许您覆盖默认模板名称(见下文)。

  • template_loader:用于加载模板的模板加载器。默认情况下,它是 django.template.loader

  • extra_context:要添加到模板上下文的值字典。默认情况下,这是一个空字典。如果字典中的值是可调用的,则通用视图将在渲染模板之前调用它。

  • context_processors:要应用到视图模板上的模板上下文处理器列表。

  • template_object_name:指定在模板上下文中使用的模板变量的名称。默认情况下,这是'object'

模板名称

如果没有指定template_name,则此视图将默认使用模板<app_label>/<model_name>_confirm_vote.html

模板上下文

除了extra_context之外,模板的上下文还将包含

  • object:即将进行投票的原始对象。该变量的名称取决于template_object_name参数,默认为'object'。如果template_object_name'foo',则该变量的名称将是foo

  • direction:传递给投票方向direction的参数(见上文)。

voting.views.xmlhttprequest_vote_on_object

描述

一个用于通过XMLHttpRequest进行对象投票的视图。如果请求方法是POST,则将对该对象进行投票。此视图将返回JSON文本,而不是渲染模板或重定向。

必需参数

  • model:将被投票的对象的 Django 模型类。

  • 必需提供 object_id 或 (slug slug_field)。

    如果您提供 object_id,它应该是被投票对象的主键字段的值。

    否则,slug 应该是给定对象的 slug,而 slug_field 应该是 QuerySet 模型中 slug 字段的名称。

  • direction:要进行的投票类型,必须是 'up''down''clear' 之一。

JSON文本上下文

返回的JSON文本提供的上下文将是

  • success:如果投票成功处理,则为true,否则为false

  • score:一个包含score属性的对象,其中包含对象的更新分数,以及包含为对象投的票总数的num_votes属性。

  • error_message:如果投票未成功处理,则此属性将包含错误信息。

模板标签

voting.templatetags.voting_tags模块定义了多个模板标签,可用于检索和显示投票详情。

标签参考

score_for_object

检索对象的总体分数及其收到的投票数,并将它们存储在具有scorenum_votes属性上下文变量中。

示例用法

{% score_for_object widget as score %}

{{ score.score }} point{{ score.score|pluralize }}
after {{ score.num_votes }} vote{{ score.num_votes|pluralize }}
scores_for_objects

检索对象的总体分数和投票数,并以对象的id为键存储为字典,并存储在上下文变量中。

示例用法

{% scores_for_objects widget_list as scores %}
vote_by_user

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

示例用法

{% vote_by_user user on widget as vote %}
votes_by_user

检索用户在对象列表上投的票,并以对象的id为键存储为字典,并存储在上下文变量中。

示例用法

{% votes_by_user user on widget_list as vote_dict %}
dict_entry_for_item

给定一个对象和一个以对象id为键的字典(由votes_by_userscores_for_objects模板标签返回)-检索给定对象的值,并将其存储在上下文变量中,如果给定对象没有值,则存储None

示例用法

{% dict_entry_for_item widget from vote_dict as vote %}
confirm_vote_message

用于投票确认模板,创建一个适当的消息,要求用户确认对给定对象描述的给定投票。

示例用法

{% confirm_vote_message widget.title direction %}

过滤器参考

vote_display

给定一个映射上/下投票值的字符串,根据给定的Vote返回一个字符串。

投票类型

参数

输出

+1

'Bodacious,Bogus'

Bodacious

-1

'Bodacious,Bogus'

Bogus

如果没有提供字符串映射,将使用“上”和“下”。

示例用法

{{ vote|vote_display:"Bodacious,Bogus" }}

项目详情


下载文件

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

源分布

django-voting-1.1.0.tar.gz (19.4 kB 查看哈希)

上传时间

构建分布

django_voting-1.1.0-py3-none-any.whl (16.1 kB 查看哈希)

上传时间 Python 3