Валидация с проверкой всех объектов модели. Django

class Questions(models.Model):
    question = models.CharField(max_length=350)

class AnswerOptions(models.Model):
    answer = models.CharField(max_length=150)
    yesorno = models.BooleanField(default=False)
    question = models.ForeignKey('Questions', 
    on_delete=models.CASCADE)

Я новичок в django и буду признателен за любые предложения. Очень надеюсь на помощь. Как в моем случае реализовать валидацию в админ панели? необходимо запретить отмечать все ответы как неправильные и все ответы как правильные. здесь за это отвечает поле BooleanField. в модели admin.py подключение реализовано через "inline".

Вы можете валидировать встроенные объекты вместе с основным объектом в методе clean() набора форм. Для этого вам необходимо определить пользовательский набор форм для AnswerOptions.

Вот рабочее решение для вашего вопроса:

from django.contrib import admin
from django.core.exceptions import ValidationError
from django.forms.models import BaseInlineFormSet

from .models import AnswerOptions, Questions


class AnswerOptionsInlineFormSet(BaseInlineFormSet):
    def clean(self):
        super().clean()

        answers_yesno = []
        for form in self.forms:
            if not form.is_valid():
                return  # other errors exist, so don't bother
            if form.cleaned_data and not form.cleaned_data.get("DELETE"):
                answers_yesno.append(form.cleaned_data.get("yesorno"))

        if answers_yesno:  # check only if we have any clean answers
            if all(answers_yesno):
                raise ValidationError("Not every answer can be 'yes'")
            if not any(answers_yesno):
                raise ValidationError("Not every answer can be 'no'")


class AnswerOptionsInline(admin.TabularInline):
    model = AnswerOptions
    formset = AnswerOptionsInlineFormSet


@admin.register(Questions)
class QuestionsAdmin(admin.ModelAdmin):
    inlines = [AnswerOptionsInline]

Дополнительный совет: В Django принято использовать форму единственного числа при именовании моделей, поэтому AnswerOption и Question будет лучше.

Вернуться на верх