Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
验证Django管理内联表单集_Django_Django Models_Django Forms - Fatal编程技术网

验证Django管理内联表单集

验证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

我需要验证内联表单集是否具有唯一值。 这个想法是能够添加一个问题和多个答案的竞争。我们可以使用复选框标记正确答案,但是我需要确保选中或保存的复选框不超过一个。 我尝试过在模型端使用clean()进行验证,也尝试过扩展BaseInlineFormSet,但是我似乎很难在formset上迭代并获得任何值

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是实现这一点的正确方法。