【问题标题】:Why doesn't django-badges award a badge when the criteria is met?当满足标准时,为什么 django-badges 不奖励徽章?
【发布时间】:2013-02-06 16:24:51
【问题描述】:

我正在尝试在我的项目中实现 django-badges,并且我正在尝试授予 Autobigrapher 徽章以填写个人资料字段,但从未授予任何徽章(已确认,因为在数据库中没有创建任何内容)。但是,如果我创建一个视图,该视图将使用 get_progress() 或 get_progress_percentage() 返回用户徽章的进度,则表明满足所需的条件。例如,我的测试视图如下所示:

#views.py
def badges(request, name):
    user = get_object_or_404(User, username=name)
    badge = Badge.objects.get(id='autobiographer')
    progress = badge.meta_badge.get_progress(user)
    progress_percentage = badge.meta_badge.get_progress_percentage(user)
    return render('badges.html', {'badge': badge, 'progress': progress, 'progress_percent': progress_percent}, request=request)

#badge_template.html
{{ progress }}
<br />
{{ progress_percent }}

#meta_badges.py
class Autobiographer(badges.MetaBadge):
    id = "autobiographer"
    model = BaseProfile
    one_time_only = True

    title = "Autobiographer"
    description = "Completed 5 User Profile Fields"
    level = "1"

    progress_start = 0
    progress_finish = 5

    def get_user(self, instance):
        return instance.user

    def get_progress(self, user):
        has_avatar = 1 if user.get_profile().avatar else 0
        has_city = 1 if user.get_profile().city else 0
        has_twitter = 1 if user.get_profile().twitter else 0
        has_facebook = 1 if user.get_profile().facebook else 0
        has_linkedin = 1 if user.get_profile().linkedin else 0
        has_google_plus = 1 if user.get_profile().google_plus else 0
        has_tumblr = 1 if user.get_profile().tumblr else 0
        return has_avatar + has_city + has_twitter + has_facebook + has_linkedin + has_google_plus + has_tumblr

    def check_avatar(self, instance):
        return instance.user.get_profile().avatar

    def check_city(self, instance):
        return instance.user.get_profile().city

    def check_twitter(self, instance):
        return instance.user.get_profile().twitter

    def check_facebook(self, instance):
        return instance.user.get_profile().facebook

    def check_linkedin(self, instance):
        return instance.user.get_profile().linkedin

    def check_tumblr(self, instance):
        return instance.user.get_profile().tumblr

    def check_google_plus(self, instance):
        return instance.user.get_profile().google_plus

如果 user1 填写了 5 个个人资料字段,example.com/badges/user1 如下所示:

5
100

任何人成功使用 django-badges 并知道我缺少什么,或者是否有其他有效的徽章解决方案?它看起来很容易使用,但我无法使用它。

【问题讨论】:

  • 有人有什么可以尝试的建议吗?不要在意它是否不起作用,只需要尝试其他东西,即使您自己从未真正使用过 django-badges。从外观上看,没有多少人。

标签: python django


【解决方案1】:

不知道你是否还在使用 django-badges 或者仍然有这个问题,因为帖子已经一个月了。我也在我的项目中使用 django-badges,它工作正常。

我认为您的代码中的问题在于您混合了两个概念,即进度数据和赢得徽章的真正标准。如果他填写了徽章所需的所有七个个人资料字段,该应用程序只会奖励您的一位用户。另一方面,进度仅评估填充了五个字段。

您可以实现一个类似于 get_progress 的单一检查方法,如果已填写五个或更多字段,则返回 True:

    def check_fields(self, instance):
        has_avatar = 1 if instance.user.get_profile().avatar else 0
        has_city = 1 if instance.user.get_profile().city else 0
        has_twitter = 1 if instance.user.get_profile().twitter else 0
        has_facebook = 1 if instance.user.get_profile().facebook else 0
        has_linkedin = 1 if instance.user.get_profile().linkedin else 0
        has_google_plus = 1 if instance.user.get_profile().google_plus else 0
        has_tumblr = 1 if instance.user.get_profile().tumblr else 0
        fields_filled = has_avatar + has_city + has_twitter + has_facebook + has_linkedin + has_google_plus + has_tumblr
        return fields_filled >= 5

希望这会有所帮助!

【讨论】:

  • 我很感激!与往常一样,事实证明我犯了一个愚蠢的错误并且使事情过于复杂。我从徽章中抽出时间去完成其他需要完成的事情,现在我终于回到了它,它起作用了。非常感谢您的帮助!
猜你喜欢
  • 2018-10-22
  • 1970-01-01
  • 2011-01-03
  • 2020-11-14
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
相关资源
最近更新 更多