Как проверить поля дочерней модели (StackedInline) на основе значения поля родительской модели в Django?

У меня следующая структура.

models.py

class Parent(models.Model):
    PROVIDER1 = "Provider1"
    PROVIDER2= "Provider2"
    PROVIDERS= (
        (PROVIDER1, "Test Provider One"),
        (PROVIDER2, "Test Provider Two"),
    )
    provider = models.CharField(
        choices=PROVIDERS,
        max_length=255,
        default=PROVIDER1,
    )
    # Few more parent fields will be here

class Child(models.Model):
    some_field= models.CharField(max_length=255)
    # Few more fields will be here
    parent = models.ForeignKey(
        Parent, on_delete=models.CASCADE
    )

admin.py

class ChildFormset(BaseInlineFormSet):
    def clean(self):
        super().clean()
        for form in self.forms:
            if not form.is_valid():
                return  # errors exist, so return

class ChildInline(admin.StackedInline):
    model = Child
    formset = ChildFormset
    extra = 1
    min_num = 1
    validate_min = True
    max_num = 1
    can_delete = False

@admin.register(Parent)
class Parent(admin.ModelAdmin):
    form = ParentForm
    inlines = [
        ChildInline,
    ]

forms.py

class ParentForm(forms.ModelForm):
    class Meta:
        model = Parent
        fields = "__all__"

    def clean(self):
        cleaned_data = super().clean()
        # How to access Child model's fields values here to validate them?


    class Media:
        # Custom JS to show/hide provider specific fields/divs
        js = ("js/mycustom.js",)

Требование:

Когда пользователь admin выбирает Provider 1 в Parent я хотел бы сделать следующее

  1. Отображение полей дочерней модели (Inline).
  2. Валидируйте поля дочерней модели при отправке.

Я смог использовать пользовательский JavaScript для первого требования (скрытие и показ полей). Но для второго требования я не могу получить поля дочерней модели в метод Parent Form's clean() или выбранные provider родительской модели в метод ChildFormset's clean().

Текущая валидация работает независимо от варианта, выбранного пользователем для Provider.

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