我们来看这个例子:
class Team (models.Model):
name = models.CharField('Name', max_length=30)
class Round (models.Model):
round_number = models.IntegerField('Round', editable=False) #Auto-incrementing per Team
team = models.ForeignKey(Team)
限制为3轮。如何在管理员内部引发错误并且通常会阻止团队进行超过3次的回合?
答案 0 :(得分:4)
通常你需要覆盖表格:
class RoundAdminForm(forms.ModelForm):
def clean_team(self):
team = self.cleaned_data['team']
if team.round_set.exclude(pk=self.instance.pk).count() == 3:
raise ValidationError('Max three rounds allowed!')
return team
class RoundAdmin(admin.ModelAdmin):
form = RoundAdminForm
如果在Round
的更改表单页面中内联编辑了Team
,则可以限制RoundInline
的{{3}}。
答案 1 :(得分:2)
我喜欢使用验证器的方式:
def restrict_amount(value):
if Round.objects.filter(team_id=value).count() >= 3:
raise ValidationError('Team already has maximal amount of rounds (3)')
class Team (models.Model):
name = models.CharField('Name', max_length=30)
class Round (models.Model):
round_number = models.IntegerField('Round', editable=False) #Auto-incrementing per Team
team = models.ForeignKey(Team, validators=(restrict_amount, ))
使用验证器将使Django正确处理它,例如,在管理面板中显示错误。
答案 2 :(得分:0)
执行此操作的最佳方法是重写save()方法,如果不满足条件,则会出错。从前端和重写save()方法的一个限制仅适用于后端验证。