ユーザーが非同期ゲームをプレイできる Web サイトを作成しています。Python 2.7.5 で Django 1.5 を実行しており、Django のネイティブ ユーザー認証 API を使用しています。カスタム User モデルを作成するのではなく、各ユーザーをカスタム 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 %}
私が望むように、最初のプレーヤーのユーザー名を提供する代わりに、「TypeError at /game/ 'ManyRelatedManager' object does not support indexing」が表示されます。変えてみたら
<td>{{ g.players|first }}</td>
...に...
<td>{{ g.players.all|first }}</td>
... 「AttributeError at /game/ 'UserDetails' object has no attribute 'username'」 が表示されます。
ゲームは私がセットアップした方法で問題なく動作しますが、これは私にフィット感を与えています. これよりも良い設定方法があるかもしれません。その点でアドバイスをいただければ幸いです。いずれにせよ、各ゲームのプレーヤーのリストからユーザー名の最初のプレーヤーを引き出すテンプレートを取得する方法を知っていますか? ありがとう!