【问题标题】:Getting model data associated with a username and displaying it in HTML in Django获取与用户名关联的模型数据并在 Django 中以 HTML 格式显示
【发布时间】:2021-06-24 17:33:01
【问题描述】:

我有一个将积分和捐赠与用户关联的模型。在我看来,我想获取当前登录用户的数据,并以 HTML 格式显示他的捐款和积分。我该怎么做呢?模型、视图和 HTML 在下面。

查看(我想获取与当前登录用户相关的积分和捐款)。:

@login_required(login_url='/login/')
def dashboard(request):
    return render(request,'dashboard.html', )

型号:

  class userdetails(models.Model):
      donations = models.IntegerField(blank=True, null = True,)
      points = models.IntegerField(blank=True, null = True,)
      user = models.ForeignKey(
            settings.AUTH_USER_MODEL,
            on_delete=models.CASCADE,
            blank=True,
            null=True,
        )

【问题讨论】:

  • 同一个用户可以有一个多个相关userdetails ,因此不存在 single pointsdonations,而是 collection

标签: python django model


【解决方案1】:

根据 [渲染文档][1],您可以传入 context,这是一个要添加到模板上下文的值字典。因此,在您看来,您将需要以下方面的内容:

@login_required(login_url='/login/')
def dashboard(request):
    user = request.user
    # assuming there is exactly one
    # this will break if there are multiple or if there are zero
    # You can (And should) add your own checks on how many userdetails objects you have for the user
    # consider using a OneToOneField instead of a ForeignKey
    user_details = user.userdetails_set.get()  # or userdetails.objects.get(user=user)
    context = {
        "donations": user_details.donations,
        "points": user_details.points,
    }
    return render(request,'dashboard.html', context=context)

然后在你的 HTML 中你可以使用 [Django 的模板语言][2]:

<div class="box">
                   <span class="value">{{ points }}</span>  
                   <span class="parameter">Points</span>
                </div>


<div class="box">
                   <span class="value">{{ donations }}</span>  
                   <span class="parameter">Donations</span>
                </div>


  [1]: https://docs.djangoproject.com/en/3.2/topics/http/shortcuts/#render
  [2]: https://docs.djangoproject.com/en/3.2/ref/templates/language/#variables

【讨论】:

  • 非常感谢您的详细解答!它真的帮助了我。只是想知道,如果我有不同的用户,这会起作用吗?例如,如果我在一个帐户上有 1 笔捐款和 2 分,我切换到另一个有 15 笔捐款和 11 分的帐户,会显示他们的积分吗?谢谢
【解决方案2】:

同一用户可以有零个、一个或多个相关的用户详细信息,因此不是一个点或捐赠,而是一个集合。

可能有两种情况来处理数据: 1. 我们枚举不同的userdetails 并渲染这些项目;或者 2. 我们将pointsdonations 相加并显示这些字段的总和。

选项 1:枚举集合

因此,我们在这里传递了相关userdetails 的集合:

@login_required(login_url='/login/')
def dashboard(request):
    details = userdetails.objects.filter(user=request.user)
    return render(request,'dashboard.html', {'details': details})

在模板中,我们使用:

{% for detail in details %}
  <div class="box">
    <span class="value">{{ detail.points }}</span>
    <span class="parameter">Points</span>
  </div>
  <div class="box">
    <span class="value">{{ detail.donations }}</span>
    <span class="parameter">Donations</span>
  </div>
{% endfor %}

选项 2:将对象聚合在一起

我们可以计算积分和捐款的总和:

from django.db.models import Sum

@login_required(login_url='/login/')
def dashboard(request):
    data = request.user.userdetails.aggregate(
        total_points=Sum('points'),
        total_donations=Sum('donations')
    )
    return render(request,'dashboard.html', data)

然后我们可以使用:

<div class="box">
  <span class="value">{{ total_points }}</span>
  <span class="parameter">Points</span>
</div>
<div class="box">
  <span class="value">{{ total_donations }}</span>
  <span class="parameter">Donations</span>
</div>

注意:Django 中的模型是用 PascalCase 编写的,而不是 snake_case, 所以您可能想将模型从 userdetails 重命名为 UserDetail

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多