2013-10-08 25 views
2

我在一個允許用戶玩異步遊戲的網站上創建。我使用Python 2.7.5運行Django 1.5,並使用Django的本地用戶身份驗證API。我沒有創建一個自定義用戶模型,而是將每個用戶鏈接到一個自定義的UserDetails類。爲的UserDetails類相關的代碼是在這裏:拉一個用戶名 - 'ManyRelatedManager'對象不支持索引

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

每個遊戲環節與一個多對多領域的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 %} 

而不是給我的第一個玩家的用戶名,因爲我的願望,我得到「類型錯誤在/遊戲/ 'ManyRelatedManager'對象不支持索引「。如果我試圖改變

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

...到...

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

...我得到 「AttributeError的在/遊戲/ '的UserDetails' 對象有沒有屬性 '名'」

遊戲運行良好,我如何設置,但這一直給我適合。可能有更好的方法來設置它,而且我很樂意在這方面提供任何建議。無論如何,你知道我怎樣才能讓模板將玩家列表中的第一名玩家從每個遊戲中拉出來嗎?謝謝!

+0

你是否在某處引用'.username'?可能在'__unicode__'? – karthikr

+0

就是這樣 - 見Daniel的答案。謝謝! –

回答

4

這裏有幾個問題。

首先,您不需要Game和UserDetails之間關係兩邊的ManyToManyFields。 Django自動爲您提供反向關係,就像ForeignKeys一樣。你應該選擇一邊並只在那裏定義場。

其次,你不顯示哪裏使用username,但我想你已經在UserDetails上定義了一個__unicode__方法,它類似於return self.username。但是,username不是UserDetails上的字段,而是在鏈接的用戶表上 - 因此它應該是self.user.username

最後,我不知道爲什麼你已經使用players可言,而不是players.all:你看它給你一個錯誤,而且您在length調用正確使用players.all以後。但是,請注意,這是非常低效的:您應該在那裏使用players.count

+0

這是完美的。你是對的 - 我在UserDetails上定義了一個__unicode__方法,並且像修改它一樣修改它。非常感謝! –