Цепочка 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, но вопрос там конкретно вращается вокруг административной стороны вещей. Мне, с другой стороны, нужен фронт-энд.