Как проверить поля дочерней модели (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 я хотел бы сделать следующее
- Отображение полей дочерней модели (Inline).
- Валидируйте поля дочерней модели при отправке.
Я смог использовать пользовательский JavaScript для первого требования (скрытие и показ полей).
Но для второго требования я не могу получить поля дочерней модели в метод Parent Form's clean()
или выбранные provider
родительской модели в метод ChildFormset's clean()
.
Текущая валидация работает независимо от варианта, выбранного пользователем для Provider.