You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django技术问题:无法根据用户等级控制游戏的显示与锁定

问题描述

已登录用户需根据自身等级(rank)访问不同游戏:等级为100时,所有游戏等级(game_rank)≤100的游戏解锁显示,其余锁定。但使用用户等级作为判断条件时,所有游戏均显示为解锁,无锁定状态;用固定值测试则正常。

问题根源
  1. 字段类型错误:User_Info.rank和Game_Info.game_rank使用CharField存储数值,字符串比较逻辑与数值比较完全不同(例如字符串"100"会被判定为小于"25"),导致比较结果全部为真。
  2. 视图逻辑错误:
    • 获取用户信息时用filter()返回QuerySet,直接访问.rank会引发错误,且无法拿到当前用户的实际等级值。
    • 注解user_unlocked_game时,错误地将game_rank与自身转换后的值比较,而非用户的等级值。
修改方案

1. 修正模型字段类型(models.py)

将等级字段改为IntegerField,确保数值比较正确:

class Game_Info(models.Model):
    id = models.IntegerField(primary_key=True, unique=True, blank=True, editable=False)
    game_title = models.CharField(max_length=100, null=True)
    # 替换CharField为IntegerField
    game_rank = models.IntegerField(null=True, blank=True, default=1)
    game_image = models.ImageField(default='default.png', upload_to='game_covers', null=True, blank=True)
    locked_game = models.BooleanField(default=0)
    unlocked_game = models.BooleanField(default=0)

class User_Info(models.Model):
    id = models.IntegerField(primary_key=True, blank=True)
    image = models.ImageField(default='/profile_pics/default.png', upload_to='profile_pics', null=True, blank=True)
    user = models.OneToOneField(settings.AUTH_USER_MODEL,blank=True, null=True, on_delete=models.CASCADE)
    # 替换CharField为IntegerField,设置默认值为整数1
    rank = models.IntegerField(null=True, blank=True, default=1)    
    user_games_enabled = models.ManyToManyField(Game_Info, blank=True, limit_choices_to={'unlocked_game': True})

注意:修改字段类型后需要执行数据库迁移:python manage.py makemigrations 和 python manage.py migrate

2. 修正视图逻辑(views.py)

修复用户信息获取方式和注解判断逻辑:

from django.db.models import Case, When, Value, BooleanField
from django.shortcuts import render

def account_view_home(request):
    user_profile = User_Info.objects.all()
    user_profile_games = Game_Info.objects.all()

    if request.user.is_authenticated:
        # 用get()获取单个用户对象,而非filter()返回的QuerySet
        user_profile = User_Info.objects.get(user=request.user)
        user_profile_rank = user_profile.rank  

        # 注解时直接比较game_rank和用户等级
        user_profile_games = Game_Info.objects.annotate(
            user_unlocked_game=Case(
                When(game_rank__lte=user_profile_rank, then=Value(True)),
                default=Value(False),
                output_field=BooleanField()
            )
        )

        context = {
            'user_profile': user_profile,
            'user_profile_games' : user_profile_games,
        }
    else:
        context = {
            'user_profile': user_profile,
            'user_profile_games' : user_profile_games
       }

    return render(request, 'home.html', context)

3. 模板无需修改

现有模板逻辑正确,修正后端后即可正常区分锁定/解锁游戏。

内容的提问来源于stack exchange,提问作者spidey677

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 20:55:26