如何在同一HTML页面上显示来自两个不同模型的数据

时间:2019-04-22 17:58:14

标签: python django django-templates django-views

我有两个表,一个叫做export const redirectDomain: any = (lang, ctx, res) => { let redirectString; const getData = async () => { try { const response = await fetch('https://www.example.com'); const data= await response.json(); return data; } catch (error) { console.log('[ERROR]'); } }; const data = getData(); const redirectUrl = data.split(','); return redirectUrl; }; ,其中包含有关播放器的信息并用作查找表。我还有另一个表(称为PlayerLkup),其中包含玩家的状态(和BattingStats)。 playerid表是一对多的(BattingStats被列出多次,每打一个赛季一次)。

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

我之前曾发布过此问题(并已将其删除),但有人错误地将其标记为重复,因此没有引起任何注意。

models.py

BattingStats

views.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)

urls.py

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

2 个答案:

答案 0 :(得分:2)

您可以在视图中执行任何操作,并在上下文中传递任意数量的模型。

但是在您的情况下,您实际上不需要更改视图,但是应该更改模型。看起来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属性的含义。没有理由使用单字符字段名像g。)

答案 1 :(得分:0)

只要您不想更改模型(我愿意),就可以:

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都可以用作模板变量。