python - 获取用户名'ManyRelatedManager'对象不支持索引

  显示原文与译文双语对照的内容
0 0

我在一个网站上创建了一个允许用户玩异步游戏的网站。 使用 python 2.7.5运行 Django 1.5,并使用 Django 用户身份验证API的本机。 我没有创建定制的用户模型,而是将每个用户链接到一个定制的UserDetails类。 UserDetails类的相关代码如下:


 class UserDetails(models.Model):
 user = models.OneToOneField(User)
 join_date = models.DateTimeField(auto_now_add=True)
 games = models.ManyToManyField(Game, default=None)

每个游戏链接到 UserDetails,并带有一个ManyToMany字段。 来自 game.models的相关代码:


 class Game(models.Model):
 title = models.CharField(max_length=60)
 create_date = models.DateTimeField(auto_now_add=True)
 started = models.BooleanField(default=False)
 players = models.ManyToManyField('user.UserDetails', default=None)

在首页,我希望有一个表列出所有正在进行的游戏。 在 views.py, 中,我使用以下命令:


 games_in_signup = Game.objects.filter(started=False)

。并将它的传递给模板。 最后,在模板中,我将生成该表的行的代码:


 {% for g in games_in_signup %}
 <tr>
 <td>{{ g.title }}</td>
 <td>{{ g.players|first }}</td>
 <td>{{ g.number_of_players }}</td>
 <td>{{ g.players.all|length }}</td>
 <td>{{ g.create_date }}</td>
 </tr>
 {% endfor %}

而不是给我第一个玩家的用户名,我想要的就是 "在/game/'ManyRelatedManager'对象中不支持索引" 如果我尝试更改


 <td>{{ g.players|first }}</td> 

。到。


 <td>{{ g.players.all|first }}</td>

。我得到了 "/game/'userdetails'对象的AttributeError没有属性'用户名'"

游戏运行得很好,但是它的设置,但这给了我一个合适的。 可以能有一个更好的方法来设置它,我欢迎在这个方面的任何建议。 在任何情况下,你都知道如何让模板从每个游戏的玩家列表中拉出用户名第一个玩家。 谢谢!

时间: 原作者:

0 0

这里有几个问题。

首先,游戏和UserDetails之间关系的双方都不需要 ManyToManyFields 。 Django 会自动给你一个反向关系,就像ForeignKeys一样。 你应该选择一边,只在这里定义字段。

其次,不显示 username的使用位置,但是我想你已经在UserDetails上定义了 __unicode__ 方法,这类似于 return self.username 。 但是,username 不是UserDetails上的字段,而是在链接的用户表上,所以它应该是 self.user.username

最后,我不确定为什么你根本不使用 players,而不是 players.all: 你看到它给出了一个错误,并且在后面的length 调用中正确使用了 players.all 。 但是,请注意,这是非常低效的: 你应该在那里使用 players.count

原作者:
...