@Eldalex

Как сделать валидацию в админ панели django?

Добрый день! подскажите как сделать валидацию в админ панели джанго:
схема такая:
есть модель с ответами на вопросы теста. она подключается inline к самим вопросам.
class AnswerAdm(admin.StackedInline):
model = Answers
fields = ('question_id', 'aswer_text', 'true_answer',)
readonly_fields = ('question_id',)

class TestquestionAdmin(admin.ModelAdmin):
list_display = ('question_id', 'test_id', 'question_text',)
list_display_links = ('question_id',)
inlines = [AnswerAdm, ]

в админке выглядит так:
638f932e102e4001726538.png
можно ли как то сделать валидацию полей формы?
чтобы например у трёх ответов не стояло одновременно три чекбокса "Верный ответ"
  • Вопрос задан
  • 1011 просмотров
Пригласить эксперта
Ответы на вопрос 1
ma4akk
@ma4akk
Да, вы можете сделать валидацию полей формы в админ панели Django. Для этого вам нужно будет использовать специальный класс ModelForm и переопределить метод clean() для проверки полей формы.

Например:
class AnswerForm(forms.ModelForm):
    class Meta:
        model = Answers
        fields = ('question_id', 'aswer_text', 'true_answer',)
        readonly_fields = ('question_id',)

    def clean(self):
        cleaned_data = super().clean()
        true_answer = cleaned_data.get("true_answer")
        if true_answer:
            # Проверяем, что у других ответов не установлен чекбокс "Верный ответ"
            answers = Answer.objects.filter(question_id=cleaned_data.get("question_id"))
            for answer in answers:
                if answer.true_answer:
                    raise ValidationError("Нельзя установить более одного верного ответа")
        return cleaned_data

class AnswerAdm(admin.StackedInline):
    form = AnswerForm
    model = Answers
    fields = ('question_id', 'aswer_text', 'true_answer',)
    readonly_fields = ('question_id',)

class TestquestionAdmin(admin.ModelAdmin):
    list_display = ('question_id', 'test_id', 'question_text',)
    list_display_links = ('question_id',)
    inlines = [AnswerAdm, ]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы