0

我正在尝试设计一个模型,该模型允许我安排活动(垒球比赛)并从更大的团队名册中创建比赛名册:

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 字段添加一些自定义验证,以便游戏名册符合联盟关于最小和最大名册规模等的规则。

当我调用以下 clean() 方法时,我得到一个 ValueError 返回('Game' 实例需要有一个主键值才能使用多对多关系。):

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 文档中四处寻找,并尝试了一些看起来很有希望的东西,但没有任何效果。

4

1 回答 1

0

在 clean 方法中,您只想进行验证检查。因此,首先保存它是一个坏主意。因此,您可以从表单对象中获取 player 字段的值并对其运行验证。当您覆盖 form clean 方法时,请记住返回cleaned_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
于 2012-12-17T00:02:43.850 回答