2013-01-19 21 views
0

我已經創建了一些自定義管理驗證,可以在一種情況下像我想要的那樣工作。如何在django管理驗證器中處理尚未創建的列表

它旨在檢查以確保在多對多字段中創建的列表具有正確數量的項(「玩家」),並且列表中男性:女性的比例可以接受。

def clean(self): 
    super(GameRosterForm, self).clean() 
    players = self.cleaned_data.get('players', None) 
    RosterRulesOn = self.cleaned_data.get('RosterRulesOn', None) 
    women = players.filter(sex='F') 
    womenPct = int((women.count()/float(players.count()))*100) 
    if RosterRulesOn is True and players.count() < 8: 
     raise ValidationError('Rosters must have at least 8 players. You have only selected %s.' % (players.count())) 
    if RosterRulesOn is True and players.count() > 18: 
     raise ValidationError('Rosters cannot have more than 18 players. You have selected %s.' % (players.count())) 
    if RosterRulesOn is True and womenPct < 40: 
     raise ValidationError('Women must make up at least 40 percent of roster. They only constitute %s percent now.' % (womenPct)) 
    return self.cleaned_data 

正如我說的,它工作正常的大部分時間,但是當用戶還沒有一名球員加入到M2M它返回一個錯誤:有一個參考名單'對象有沒有屬性「過濾器」 women = players.filter(sex ='F')line。

我試過一些「如果」和「嘗試」條件試圖繞過問題,但找不到可行的解決方案。

回答

0

如何:

players = self.cleaned_data.get('players', None) 
RosterRulesOn = self.cleaned_data.get('RosterRulesOn', None) 
women = [player for player in players if player.sex=='F'] 
womenPct = int((len(women)/float(players.count()))*100) 
+0

這樣的作品,但它發現了一個類似的問題與計數()語句。用len()代替所有工作。謝謝。 –