1

私は自分のプロジェクトにdjango-badgeを実装しようとしています.プロファイルフィールドに記入するためのAutobiographerバッジを授与しようとしていますが、バッジは授与されていません(データベースに何も作成されていないため確認されています). ただし、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をうまく使っていて、私が欠けているものを知っていますか、それとも機能する別のバッジソリューションがありますか? 使いやすそうに見えたのですが、うまくいきません。

4

1 に答える 1

1

まだ django-badges を使用しているか、この問題がまだ発生しているかどうかはわかりません。投稿が 1 か月前のものだからです。私も自分のプロジェクトで django-badges を使用していますが、問題なく動作します。

あなたのコードの問題は、進行状況データとバッジを獲得するための実際の基準という 2 つの概念が混在していることだと思います。アプリは、バッジに必要な 7 つのプロファイル フィールドすべてに入力したユーザーの 1 人だけに賞を与えます。一方、進行状況は、5 つのフィールドが満たされていることのみを評価します。

5 つ以上のフィールドが入力された場合に True を返す、get_progress と同じように見える単一のチェック メソッドを実装できます。

    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

お役に立てれば!

于 2013-03-12T15:53:44.597 に答える