【问题标题】:How to display objects related to a specific foreign key object?如何显示与特定外键对象相关的对象?
【发布时间】:2019-04-17 05:45:56
【问题描述】:

我正在尝试制作一个游戏应用,人们可以在其中创建自己的球队,然后创建球员并将球员与特定球队相关联。问题是我怎样才能只显示与其连接的球队中的球员。

提前感谢您的帮助。

这是我的models.py

class Team(models.Model):
   name = models.CharField(max_length =240)
   captain = models.CharField(max_length = 240)
   v_captain =  models.CharField(max_length = 240)

   def get_absolute_url(self):
    return reverse('games_app:detail',kwargs = {'pk':self.pk})

   def __str__(self):
    return self.name    


class Players(models.Model):    
 over = models.CharField(max_length = 10)
 batting = models.CharField(max_length = 100)
 player_team = models.ForeignKey(Team,related_name = "teams")

这里是views.py

class List_Players(generic.ListView):
 model = models.Players
 template_name = 'games_app/players_list.html'

这里是 HTML

 <!DOCTYPE html>
 <html>
 <head>
<title></title>
 </head>
 <body>
{% for i in object_list.player_team %}
<h1>Players :<strong>{{i.player_name}}</strong>
    {% endfor %}
</body>
</html>

【问题讨论】:

  • 您的问题不清楚。您的视图列出了Players 对象,而不是Teams。此外,您似乎对related_name 参数感到困惑,它应该是相反的(即related_name="players")。附带说明一下,考虑将 Players 重命名为 Player,因为它更符合 Django 的命名约定。
  • 为什么要查看团队视图
  • 我将如何解决真正的问题。
  • 我不想让团队查看,我是说您的代码与您的问题不符。真正的问题是什么?正如我所说,目前还不清楚。您写道您想要display the players in a team ,但您的代码似乎无关紧要。编辑您的问题以包含预期输出的示例可能会有所帮助。
  • 我已经写过我只想展示那些和那个球队有联系的球员。

标签: django django-models django-views


【解决方案1】:

它可以像:--

 class Team(models.Model):
    name = models.CharField(max_length =240)
    captain = models.CharField(max_length = 240)
    v_captain =  models.CharField(max_length = 240)

    def get_absolute_url(self):
       return reverse('games_app:detail',kwargs = {'pk':self.pk})

    def __str__(self):
       return self.name    


class Players(models.Model):    
   over = models.CharField(max_length = 10)
   batting = models.CharField(max_length = 100)
   player_team = models.ForeignKey(Team,related_name = "teams")

这里是views.py

class Team_list(generic.ListView):
  model = models.Team
  template_name = '''make a new template here'''
  context_object_name = 'team_list'

class List_Players(generic.DetailView):
    model = models.Players
    template_name = 'games_app/players_list.html'
    context_object_name = 'team_detail'

这里是 HTML

   <!DOCTYPE html>
   <html>
   <head>
   <title></title>
   </head>
   <body>
   <h1>{{ team_detail.name }}</h1>
   <h1>{{ team_detail.captain }}</h1>
   <h1>{{ team_detail.v_captain }}</h1>

   {% for players in team_detail.teams.all %}
   <h1>Players :<strong>{{players.over}}</strong></h1>
       {{ players.over }}
        {{ players.batting }}

   {% endfor %}
   </body>
   </html>

您必须为您的团队列表视图创建新的 Html 文件,通过该文件您可以通过使用标签将您的整个团队的详细视图链接到您的团队名称

<!DOCTYPE html>
   <html>
   <head>
   <title></title>
   </head>
   <body>
   {% for teams in team_list %}
   <h3>
      <a href='{% url 'TYPE IN UR URL NAME' pk=teams.pk %}'>{{ teams.name }}</a>
   </h3>

   {% endfor %}
   </body>
   </html>

【讨论】:

    【解决方案2】:

    您需要遍历object_list 中的每个player 并打印出与之关联的团队的团队成员。

    {% for player in object_list %}
        <p> {{player.player_name}} </p>
        {% for i in player.player_team.players %}
            <h1>Players :<strong>{{i.player_name}}</strong>
        {% endfor %}
    {% endfor %}
    

    但这根本不推荐。

    这将导致大量的冗余信息。您应该使用TeamListView 显示每个团队的成员,或在DetailViewPlayer 上显示团队成员。考虑更改页面设计。

    【讨论】:

    • 这行不通。它显示了数据库中的所有玩家。
    • 显然,因为您询问了PlayersListView。我告诉过你,你应该使用TeamListView
    猜你喜欢
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    相关资源
    最近更新 更多