【发布时间】: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参数如何获取用户实例及其相关积分。跨度> -
你有没有得到任何地方?