为什么我的Django自定义验证器失败了?

时间:2012-12-16 23:52:08

标签: django validation django-admin many-to-many

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

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文档中搜索并尝试了一些看起来很有前景的东西,但没有任何效果。

1 个答案:

答案 0 :(得分:0)

在clean方法中,您只想进行验证检查。因此,首先保存它将是一个坏主意。因此,从表单对象中,您可以获取players字段的值并对其运行验证。当您覆盖表单清理方法时,请记得返回cleaning_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