我正在一个允许用户玩异步游戏的网站上创建。我正在使用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)
每个游戏都链接到带有ManyToMany字段的UserDetails。来自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 %}
而不是像我希望的那样给我第一个玩家的用户名,我得到“/ error /”中的TypeError''ManyRelatedManager'对象不支持索引“。如果我尝试改变
<td>{{ g.players|first }}</td>
...到...
<td>{{ g.players.all|first }}</td>
...我得到“/ / / / / UserDetails”对象没有属性'用户名'“。
游戏运行良好,我的设置如何,但这给了我适合。设置它可能有比这更好的方法,我欢迎任何有关这方面的建议。在任何情况下,你知道如何让模板从每个游戏的玩家列表中拉出用户名第一个玩家吗?谢谢!
答案 0 :(得分:5)
这里有几个问题。
首先,Game和UserDetails之间的关系两边都不需要ManyToManyFields。 Django会自动为您提供反向关系,就像使用ForeignKeys一样。您应该选择一侧并仅在那里定义字段。
其次,您没有显示使用username
的位置,但我猜您在UserDetails上定义了__unicode__
方法,类似于return self.username
。但是,username
不是UserDetails上的字段,而是链接的User表上的字段 - 因此它应该是self.user.username
。
最后,我不确定您为什么使用players
而不是players.all
:您看到它会给您一个错误,而且您已正确使用players.all
稍后length
来电。但请注意,效率极低:您应该在那里使用players.count
。