2012-12-16 95 views
0

我想設計一個模型,讓我安排的活動(壘球比賽),並從一個更大的團隊陣容打造的遊戲名單:爲什麼我的Django自定義驗證器失敗?

class Game(models.Model): 
DateTime = models.DateTimeField() 
opponent = models.CharField(max_length = 50, default="TBD") 
players = models.ManyToManyField(Player, limit_choices_to={'id__in': Player.objects.filter(active='True')},blank=True) 

到目前爲止好。但是我也想給球員ManyToMany領域添加一些自定義驗證,這樣遊戲花名冊就符合關於最小和最大花名冊大小的聯盟規則,等等。

當我撥打以下清潔()方法,我得到一個ValueError返回(「遊戲」實例都需要有前多到許多可用於關係的主鍵值。):

def clean(self, *args, **kwargs): 
    from django.core.exceptions import ValidationError 
    #self.save() 
    players_count = self.players.count() 
    # Don't allow rosters with fewer than 9 players 
    if players_count < 9: 
     raise ValidationError('Rosters must have at least 9 players') 

如果我插入被註釋掉的self.save,驗證器可以正常工作,但我最終會得到多個遊戲入口。

我是新手 - 這是我的第一個非教程Django項目 - 所以我猜這是一個相當簡單的答案。我在這裏探討了Django文檔並嘗試了一些看起來很有希望的東西,但沒有任何成果。

回答

0

在乾淨的方法,你只是想做驗證檢查。所以,保存它首先是一個壞主意。所以,從表單對象中,你可以獲得玩家字段的值並在其上運行驗證。當您重寫表單清理方法時,請記得返回cleared_data。

def clean(self, *args, **kwargs): 
    from django.core.exceptions import ValidationError 
    players = self.cleaned_data.get('players', []) 
    players_count = len(players): 
    # Don't allow rosters with fewer than 9 players 
    if players_count < 9: 
     raise ValidationError('Rosters must have at least 9 players') 
    return self.cleaned_data 
+0

恐怕不適合我。得到AtrributeError:'遊戲'對象沒有屬性'cleaned_data' –

+0

找出來。這個答案基本上可行,但我沒有創建一個新的表單類來處理它。 –