Валидация с проверкой всех объектов модели. 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 будет лучше.