Django-admin 对外部对象的验证
Django-admin validation on Foreign object
我有一个 Team 模型和 Staff 模型(对 Team 来说是外来的)。每个团队对象可以关联 1 - 10 个员工对象。
每个员工对象都有一个布尔字段来指示 he/she 是否是团队协调员。
我如何在 django 管理页面中确保当管理员用户输入团队信息以及相关员工信息(内联)时,he/she 必须至少选择一个团队协调员(一个团队中的所有员工都可以)团队都是协调员,但不能为零)。
感谢您的建议。
models.py
class Team(models.Model):
team_id = models.AutoField(primary_key=True, verbose_name='Team ID')
team_name = models.CharField(max_length=100, verbose_name='Team Name')
def __str__(self):
return self.team_name
class Meta:
verbose_name='Team'
class Staff(models.Model):
staff_id = models.AutoField(primary_key=True)
team_id = models.ForeignKey(Team)
staff_name = models.CharField(max_length=100, verbose_name='Staff Name')
is_team_coord = models.BooleanField(verbose_name='Is Team Coordinator', default=False)
def __str__(self):
return self.staff_name
class Meta:
verbose_name='Staff'
admin.py
class StaffInLine(admin.TabularInline):
model = Staff
def get_max_num(self, request, obj=None, **kwargs):
return 10
def get_min_num(self, request, obj=None, **kwargs):
return 1
class TeamAdmin(admin.ModelAdmin):
inlines = [StaffInLine]
参考这个link我自己找到了答案
Inline Form Validation in Django
完整的解决方案是:
forms.py
class StaffInLineFormSet(forms.models.BaseInlineFormSet):
def clean(self):
count = 0
for form in self.forms:
try:
if form.cleaned_data.get('is_team_coord') is True:
count += 1
except AttributeError:
pass
if count == 0:
raise forms.ValidationError('You must choose at least one Team Coordinator')
admin.py
class StaffInLine(admin.TabularInline):
model = Staff
formset = StaffInlineFormSet
def get_max_num(self, request, obj=None, **kwargs):
return 10
def get_min_num(self, request, obj=None, **kwargs):
return 1
我有一个 Team 模型和 Staff 模型(对 Team 来说是外来的)。每个团队对象可以关联 1 - 10 个员工对象。
每个员工对象都有一个布尔字段来指示 he/she 是否是团队协调员。
我如何在 django 管理页面中确保当管理员用户输入团队信息以及相关员工信息(内联)时,he/she 必须至少选择一个团队协调员(一个团队中的所有员工都可以)团队都是协调员,但不能为零)。
感谢您的建议。
models.py
class Team(models.Model):
team_id = models.AutoField(primary_key=True, verbose_name='Team ID')
team_name = models.CharField(max_length=100, verbose_name='Team Name')
def __str__(self):
return self.team_name
class Meta:
verbose_name='Team'
class Staff(models.Model):
staff_id = models.AutoField(primary_key=True)
team_id = models.ForeignKey(Team)
staff_name = models.CharField(max_length=100, verbose_name='Staff Name')
is_team_coord = models.BooleanField(verbose_name='Is Team Coordinator', default=False)
def __str__(self):
return self.staff_name
class Meta:
verbose_name='Staff'
admin.py
class StaffInLine(admin.TabularInline):
model = Staff
def get_max_num(self, request, obj=None, **kwargs):
return 10
def get_min_num(self, request, obj=None, **kwargs):
return 1
class TeamAdmin(admin.ModelAdmin):
inlines = [StaffInLine]
参考这个link我自己找到了答案 Inline Form Validation in Django
完整的解决方案是:
forms.py
class StaffInLineFormSet(forms.models.BaseInlineFormSet):
def clean(self):
count = 0
for form in self.forms:
try:
if form.cleaned_data.get('is_team_coord') is True:
count += 1
except AttributeError:
pass
if count == 0:
raise forms.ValidationError('You must choose at least one Team Coordinator')
admin.py
class StaffInLine(admin.TabularInline):
model = Staff
formset = StaffInlineFormSet
def get_max_num(self, request, obj=None, **kwargs):
return 10
def get_min_num(self, request, obj=None, **kwargs):
return 1