2

ユーザーが非同期ゲームをプレイできる 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'」 が表示されます。

ゲームは私がセットアップした方法で問題なく動作しますが、これは私にフィット感を与えています. これよりも良い設定方法があるかもしれません。その点でアドバイスをいただければ幸いです。いずれにせよ、各ゲームのプレーヤーのリストからユーザー名の最初のプレーヤーを引き出すテンプレートを取得する方法を知っていますか? ありがとう!

4

1 に答える 1

4

ここにはいくつかの問題があります。

まず、Game と UserDetails の間の関係の両側に ManyToManyFields は必要ありません。Django は、ForeignKeys と同様に、逆の関係を自動的に提供します。片側を選択して、そこだけにフィールドを定義する必要があります。

次に、 が使用されている場所を示していませんが、 UserDetails に のようなメソッドをusername定義したと思います。ただし、UserDetails のフィールドではなく、リンクされた User テーブルのフィールドであるため、.__unicode__return self.usernameusernameself.user.username

最後にplayers、代わりにplayers.all: を使用した理由がまったくわかりません。エラーが発生し、さらに後で呼び出しで正しく使用players.allしたことがわかります。lengthただし、これは非常に非効率的であることに注意してください。そこで使用する必要がplayers.countあります。

于 2013-10-08T21:28:44.617 に答える