Цепочка ModelSelect2Widget

У меня есть эти модели:

from django.db import models

class ValidationCheckType(models.Model):
    name = models.CharField(max_length=255)
    nicename = models.CharField(max_length=255)
    description = models.CharField(max_length=255, blank=True)

    def __str__(self):
        return self.nicename


class ValidationCheckTarget(models.Model):
    name = models.CharField(max_length=255)
    nicename = models.CharField(max_length=255)
    type = models.ForeignKey('ValidationCheckType', on_delete=models.PROTECT)

    def __str__(self):
        return ' - '.join([self.type.nicename, self.nicename])


class DirectiveCheck(models.Model):
    directive = models.ForeignKey(Directive, on_delete=models.CASCADE)
    check_type = models.ForeignKey(ValidationCheckType, on_delete=models.PROTECT, related_name='types')
    check_target = models.ForeignKey(ValidationCheckTarget, on_delete=models.PROTECT, related_name='targets')
    target_value = models.CharField(max_length=255, blank=True)

Итак, ValidationCheckType представляет собой категорию верхнего уровня, которая фильтрует выбор ValidationCheckTarget, чтобы обеспечить отображение только соответствующих целей в зависимости от выбранного типа. Так и должно быть.

Теперь перейдем к формам. Согласно django_select2.forms.ModelSelect2Widget и customizing-a-form я должен иметь возможность сделать что-то вроде этого:

from django import forms
from django_select2 import forms as s2forms
from .models import DirectiveCheck, ValidationCheckTarget, ValidationCheckType

class DirectiveCheckForm(forms.ModelForm):
    class Meta:
        model = DirectiveCheck
        fields = ['check_type', 'check_target', 'target_value']
        widgets = {
            'check_type': s2forms.ModelSelect2Widget(
                model=ValidationCheckType,
                search_fields=['nicename__icontains'],
            ),
            'check_target': s2forms.ModelSelect2Widget(
                model=ValidationCheckTarget,
                search_fields=['nicename__icontains'],
                dependent_fields={'check_type': 'id'},  
                max_results=10,
                attrs={
                    "data-minimum-input-length": 0,
                    "data-placeholder": "Select a check_type first",
                }
            )
        }

Хорошая новость заключается в том, что выпадающий список check_type работает.

Плохая новость заключается в том, что выпадающий список check_target этого не делает. Он не фильтрует результаты в соответствии с выбором в check_type.

Если я обращаюсь к автоматически сгенерированному AJAX URL, созданному виджетом, и использую его для тестирования, я (похоже) получаю результаты только при использовании параметров запроса, которые не отображаются как поля в модели. Очевидно, что я упускаю какой-то важный момент в рабочем процессе. Но что?

Я также нашел эту ссылку о django_select2, но вопрос там конкретно вращается вокруг административной стороны вещей. Мне, с другой стороны, нужен фронт-энд.

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