【问题标题】:How to display data from two different models on the same HTML page如何在同一个 HTML 页面上显示来自两个不同模型的数据
【发布时间】:2019-09-11 21:44:43
【问题描述】:

我有两张表,其中一张名为PlayerLkup,其中包含有关播放器的信息并用作查找表。我有另一个表(称为BattingStats),其中包含玩家的统计数据(和playerid)。 BattingStats 表是一对多的(playerid 被多次列出,每个赛季一次)。

我来自PlayerLkup 的数据显示正常,它使用URL 地址中的playerid 来检索特定播放器。我的问题是如何将我的 BattingStats 模型/表中的数据使用到同一页面上?我假设我的视图页面是需要完成工作的地方。有没有办法将多个模型传递到一个视图中?我试过相同的网址,不同的观点。它似乎对我不起作用。我需要做什么?这里的任何帮助将不胜感激。

我之前发布过这个问题(后来删除了它),但有人错误地将它标记为重复,所以它没有受到任何关注。

models.py

class BattingStats(models.Model):
    playerid = models.CharField(db_column='playerID', max_length=9)
    year = models.IntegerField(db_column='Year', blank=True, null=True)
    g = models.IntegerField(db_column='G', blank=True, null=True)
    ab = models.IntegerField(db_column='AB', blank=True, null=True)
    r = models.IntegerField(db_column='R', blank=True, null=True)
    hr = models.IntegerField(db_column='HR', blank=True, null=True)
    rbi = models.IntegerField(db_column='RBI', blank=True, null=True)
    sb = models.IntegerField(db_column='SB', blank=True, null=True)

class PlayerLkup(models.Model):
    playerid = models.CharField(db_column='playerID', primary_key=True, max_length=255)
    birthyear = models.IntegerField(db_column='birthYear', blank=True, null=True)
    birthmonth = models.IntegerField(db_column='birthMonth', blank=True, null=True)
    birthday = models.IntegerField(db_column='birthDay', blank=True, null=True)
    birthstate = models.CharField(db_column='birthState', max_length=255, blank=True, null=True)
    birthcity = models.CharField(db_column='birthCity', max_length=255, blank=True, null=True)
    namefirst = models.CharField(db_column='nameFirst', max_length=255, blank=True, null=True)
    namelast = models.CharField(db_column='nameLast', max_length=255, blank=True, null=True)
    weight = models.IntegerField(blank=True, null=True)
    height = models.IntegerField(blank=True, null=True)

views.py

def player_info(request, playerid):
    playerdata = PlayerLkup.objects.get(playerid=playerid)
    return render(request, 'careerstats/playerpage.html', {'playerdata': playerdata})

urls.py

urlpatterns = [
    path('player/<str:playerid>/', views.player_info, name='player_info'),

【问题讨论】:

    标签: python django django-templates django-views


    【解决方案1】:

    您可以在视图中做任何您喜欢的事情,并在上下文中传递任意数量的模型。

    但在您的情况下,您实际上并不需要更改视图,但您应该更改模型。看起来 BattingStats 应该通过 playerid 字段与 PlayerLkup 建立关系。您应该将其设为 ForeignKey(并称其为 player) - 请注意,您实际上根本不需要更改基础表,这可能很重要,因为这似乎是一个遗留数据库。

    class BattingStats(models.Model):
        player = models.ForeignKey('PlayerLkup', db_column='playerID')
    

    现在您可以在模板中执行以下操作:

    {{ playerdata.namefirst }}
    {% for stat in playerdata.battingstats_set.all %}
      {{ stat.year }}
      {{ stat.g }}
      ... 
    {% endfor %}
    

    (另外,请为您的字段提供更好的名称。它们不需要与 db 列相同,这就是 db_column 属性的用途。没有理由使用像 @ 这样的单字符字段名称987654326@.)

    【讨论】:

    • 这是我想了解更多关于{% for stat in playerdata.battingstats_set.all %}的部分。 playerdata 来自字典,对吗? battingstats_set.all 是从哪里来的?那是型号名称。为什么都是小写的?
    • 这是相反的关系。你完成了 Django 教程吗?这一切都在那里解释。
    • 我看到您提供的模型与我的模型中已有的名称相同。我不会给它一个不同的名字。我正在添加一个新模型,对吗?我不应该改变现有的 BattingStats 模型吗?对吗?
    • 什么?这根本不是我说的。您不需要新模型,只需更改现有 BattingStats 模型上的 playerid 字段即可。
    • 这是对我有用的实际代码。几乎相同的东西playerid = models.ForeignKey('PlayerLkup', models.DO_NOTHING, db_column='playerID', blank=True, null=True)。我确实启动了 MySQL Workbench 来添加外键。不这样做我就没有尝试过
    【解决方案2】:

    以防万一您不想更改模型(我愿意),您可以:

    def player_info(request, playerid):
        playerdata = PlayerLkup.objects.get(playerid=playerid)
        battingdata = BattingStats.objects.get(playerid=playerid)
        data = {
             'playerdata': playerdata,
             'battingdata': battingdata
        }
        return render(request, 'careerstats/playerpage.html', data)
    

    在您的模板中,playerdatabattingdata 都可用作模板变量。

    【讨论】:

    • 例如,如果我想显示一个玩家的所有year。使用您的方法,我的 for 循环会是什么样子?这种方式适用于一对多?
    • 有人知道我会如何使用这种方法在我的模板中调用 for 循环吗?
    • 好吧,实现您想要的正确(且更简单)的方法是遵循 Daniel 的建议。否则,您将不得不手动构建数据。我将更新答案以说明如何。
    • @NickT,在为我的答案编写更新时,我意识到使用这种方法所要做的工作不值得,只需使用 Daniel 的方法。
    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 2021-08-02
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    相关资源
    最近更新 更多