用户名未显示,但用户 ID 显示在 Django 的 html 模板中

Posted

技术标签:

【中文标题】用户名未显示,但用户 ID 显示在 Django 的 html 模板中【英文标题】:Username is not showing but user id is showing in html template in Django 【发布时间】:2021-07-05 00:50:12 【问题描述】:

下面是我的模型:

class Problem_Solved(models.Model):
    user_ref = models.ForeignKey(User, on_delete=models.CASCADE)
    contest_ref = models.ForeignKey(Contest, on_delete=models.CASCADE)
    problem_ref = models.ForeignKey(Problem, on_delete=models.CASCADE)
    points_get = models.IntegerField(default=0)
    time_submitted = models.DateTimeField('date published')
    
    class Meta:
        unique_together = (("user_ref", "problem_ref"))
        

    def __str__(self):
        return self.user_ref.username + " solved " + self.problem_ref.problem_name + " and got " + str(self.points_get) + " marks " 

下面是我的视图函数:

def pointtable(request, contest_id):
    context = 
    contest_obj=Contest.objects.get(pk=contest_id)
    points_list = Problem_Solved.objects.filter(contest_ref = 
      contest_obj).values('user_ref').annotate(user_sum = Sum('points_get')).order_by('-user_sum')
    print(points_list)
    context['points_list'] = points_list
    return render(request,'leaderboard.html', context)

下面是我的html代码:

% for pt in points_list %
            <div class="container-sm w-75  tb-bg-color">
                <div class="row mb-3 ">
                    <div class="col-1 themed-grid-col col-border">forloop.counter</div>
                    <div class="col-6 themed-grid-col col-border">pt.user_ref.username</div>
                    <div class="col-2 themed-grid-col col-border">pt.user_sum</div>
                </div>
            </div>
    % endfor %

下面是输出:

Username is not showing

从图片中可以清楚地看出,用户名没有显示,但如果我在我的 html 代码中编写 pt.user_ref,那么它将打印 user_id,如下所示:

User id is showing

现在我想要用户名而不是用户 ID,我应该怎么做,因为我从 2 天开始就被这个问题困住了。如果可以,请帮助我。

【问题讨论】:

显示您的用户模型 您已使用values 进行分组。这将返回一个值字典,其中包含由其 id 表示的外键(这就是用户名不显示的原因)。 我还没有创建用户模型。我使用了 Djnago 提供的默认用户模型 好的@AbdulAzizBarkat,但如果我删除值,那么它不会对用户的points_get求和。有没有其他方法可以显示用户名? 【参考方案1】:

由于您希望每个用户的积分记录在 User 模型上进行注释,因此您将获得 User 对象的 QuerySet,因此您可以简单地获取用户名:

def pointtable(request, contest_id):
    context = 
    contest_obj=Contest.objects.get(pk=contest_id)
    contest_users = User.objects.filter(
        problem_solved__contest_ref = contest_obj
    ).annotate(
        point_sum=Sum('problem_solved__points_get')
    ).order_by('-point_sum')
    context['contest_users'] = contest_users
    return render(request,'leaderboard.html', context)

现在您的 html 将是:

% for contest_user in contest_users %
    <div class="container-sm w-75  tb-bg-color">
        <div class="row mb-3 ">
            <div class="col-1 themed-grid-col col-border">forloop.counter</div>
            <div class="col-6 themed-grid-col col-border">contest_user.username</div>
            <div class="col-2 themed-grid-col col-border">contest_user.point_sum</div>
        </div>
    </div>
% endfor %

注意:类名中不应包含下划线。所以ProblemSolved 而不是Problem_Solved

【讨论】:

以上是关于用户名未显示,但用户 ID 显示在 Django 的 html 模板中的主要内容,如果未能解决你的问题,请参考以下文章

会话 ID 未显示错误消息注意:未定义索引:用户 ID [重复]

用户 ID 未显示在 Google Analytics(分析)仪表板 (iOS) 中

Django视图按用户向访问者显示对象

数据未保存在会话变量中

DJANGO - 如果未找到数据,如何显示“未找到您的搜索”

如何在我的Django模板上删除“未设置密码”以编辑配置文件