验证Django管理内联表单集
我需要验证内联表单集是否具有唯一值。 这个想法是能够添加一个问题和多个答案的竞争。我们可以使用复选框标记正确答案,但是我需要确保选中或保存的复选框不超过一个。 我尝试过在模型端使用clean()进行验证,也尝试过扩展BaseInlineFormSet,但是我似乎很难在formset上迭代并获得任何值验证Django管理内联表单集,django,django-models,django-forms,Django,Django Models,Django Forms,我需要验证内联表单集是否具有唯一值。 这个想法是能够添加一个问题和多个答案的竞争。我们可以使用复选框标记正确答案,但是我需要确保选中或保存的复选框不超过一个。 我尝试过在模型端使用clean()进行验证,也尝试过扩展BaseInlineFormSet,但是我似乎很难在formset上迭代并获得任何值 class Competition(models.Model): title = models.CharField(max_length=255) slug = models.Sl
class Competition(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField(unique=True, blank=False)
content = models.TextField()
terms = models.TextField()
class Question(models.Model):
competition = models.OneToOneField(
Competition,
on_delete=models.CASCADE,
primary_key=True,
)
question = models.CharField(max_length=255)
class Answer(models.Model):
question = models.ForeignKey(Question)
answer = models.CharField(max_length=255)
is_correct = models.BooleanField(default=False)
所以,经过一夜的睡眠,我似乎已经设法修复了它
from django.forms.models import BaseInlineFormSet
from django.core.exceptions import ValidationError
class AnswerInlineFormSet(BaseInlineFormSet):
def clean(self):
super(AnswerInlineFormSet, self).clean()
total_checked = 0
for form in self.forms:
if not form.is_valid():
return
if form.cleaned_data and not form.cleaned_data.get('DELETE'):
if form.cleaned_data['is_correct']:
total_checked += 1
if total_checked > 1:
raise ValidationError("You cannot have more than one correct answer")
if total_checked < 1:
raise ValidationError("You must have at least one correct answer")
从django.forms.models导入BaseInlineFormSet
从django.core.exceptions导入ValidationError
类AnswerInlineFormSet(BaseInlineFormSet):
def清洁(自清洁):
super(AnswerInlineFormSet,self).clean()
检查的总数=0
对于self.forms中的表单:
如果不是表单,则表单是否有效()
返回
如果form.cleaned_数据而不是form.cleaned_数据.get('DELETE'):
如果form.cleaned_数据['is_correct']:
检查总数+=1
如果选中的总数>1:
引发ValidationError(“您不能有多个正确答案”)
如果检查的总_小于1:
raise ValidationError(“您必须至少有一个正确答案”)
您可以发布覆盖BaseInlineFormSet时尝试使用的代码吗?我认为在表单集上覆盖clean是实现这一点的正确方法。