【问题标题】:Integrating pinax-badges in django with a points system将 django 中的 pinax-badges 与积分系统集成
【发布时间】:2018-05-14 17:43:32
【问题描述】:

我无法让 pinax-badges 在我的项目中工作。我遵循了在我的应用程序中创建一个 badges.py 文件所提供的最小用法 example

#badges.py

from pinax.badges.base import Badge, BadgeAwarded
from pinax.badges.registry import badges


class PointsBadge(Badge):
    slug = "points"
    levels = [
      "Bronze",
      "Silver",
      "Gold",
     ]
    events = ["points_awarded",]
    multiple = False

    def award(self, **state):
        user = state["user"]
        points = user.get_profile().points
        if points > 10000:
            return BadgeAwarded(level=3)
        elif points > 7500:
            return BadgeAwarded(level=2)
        elif points > 5000:
            return BadgeAwarded(level=1)


badges.register(PointsBadge)

在我的用户模型中调用 a 的一个非常糟糕的点函数接受一个数量参数并将其添加到我的用户模型中的点字段。

#User Model
class User(AbstractUser):
    ....
    points = models.IntegerField(default=0)

def award_points(self,amount):
    self.amount = amount
    self.points+=amount
    self.save()

现在我在一个信号中调用的函数会检查用户何时登录并奖励他们一些积分。就像这样

#signal.py
from django.contrib.auth.signals import user_logged_in,user_logged_out
from django.dispatch import receiver
from django.conf import settings
from pinax.badges.registry import badges


@receiver(user_logged_in)
def award(sender,request ,user, **kwargs):
    user = request.user.award_points(5000)
    badges.possibly_award_badge("points_awarded", user=user)

为了确定,我也注册了信号。我仍然没有得到想要的结果,也就是说,一旦用户登录并获得 5000 分,这对于 badges.py 文件中定义的 1 级徽章来说已经足够了。 除了信号之外,我不确定是否有更有效的方法来实现此结果,除非当然有人推荐了一种不同的方法。

感谢回复。

【问题讨论】:

  • 发现了问题。我搞砸了我的信号函数定义。起作用的是,我只是将信号移动到我的用户模型并删除了请求参数,并将其以旧方式连接到 `user_logged_in.connect(award) at the end like so. def Award(sender, user, **kwargs): user = user.award_points(5000) badges.possibly_award_badge("points_awarded", user=user) user_logged_in.connect(award) `
  • 以上仅用于积分,徽章似乎不起作用,我不确定**state 参数如何获取用户实例及其相关积分。跨度>
  • 你有没有得到任何地方?

标签: python django pinax


【解决方案1】:

我是这样做的。

models.py

from django.template.defaultfilters import slugify
from django.db import models
from django.contrib.auth.models import User

from pinax.badges.base import Badge, BadgeAwarded
from pinax.badges.registry import badges

class PointsBadge(Badge):
    slug = "points"
    levels = [
        "Bronze",
        "Silver",
        "Gold",
    ]
    events = [
        "points_awarded",
    ]
    multiple = False

    def award(self, **state):
        user = state["user"]
        points = user.profile.points
        if points > 500:
            return BadgeAwarded(level=3)
        elif points > 50:
            return BadgeAwarded(level=2)
        elif points > 5:
            return BadgeAwarded(level=1)

badges.register(PointsBadge)

class Profile(models.Model):
    user = models.OneToOneField(
        User,
        on_delete = models.CASCADE
    )
    points = models.IntegerField (
        default = 0
    )

    def award_points (self, points):
        self.points += points
        self.save()

signals.py 我在创建 user 时创建 profile

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)

然后在我的view

    request.user.profile.award_points(p.points)
    badges.possibly_award_badge("points_awarded", user=request.user)

【讨论】:

  • 我只得到了积分。徽章仍然难以捉摸。如果可行,我会再试一次并投票。谢谢。
  • 徽章适用于我的方法,这就是我将其作为答案的原因
猜你喜欢
  • 2011-04-27
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2014-05-17
  • 2023-04-04
  • 2012-06-01
  • 2011-12-01
  • 2010-11-12
相关资源
最近更新 更多