Django ModelForm: виджет фильтра поиска по полю "многие ко многим

Я работаю с этой моделью:

class Sample(models.Model):
    id_sample = models.AutoField(primary_key=True)
    name = models.CharField(unique=True, max_length=20)
    sample_id_sex = models.ForeignKey(Sex, on_delete=models.CASCADE, db_column='id_sex', verbose_name='Sexe')
    pools = models.ManyToManyField(Pool, through='SamplePoolIndexCand', through_fields=('sample_id', 'pool_id'), blank=True, verbose_name="Pools")

pools является полем m2m из этой модели:

class Pool(models.Model):
    id_pool = models.AutoField(primary_key=True)
    name = models.CharField(unique=True, max_length=50, verbose_name="Pool")
    samples = models.ManyToManyField('Sample', through='SamplePoolIndexCand', blank=True, verbose_name="Mostres")

Я создал это ModelForm:

class FormulariMostra(ModelForm):
    class Meta:
        model = Sample
        fields = ("name", "sample_id_sex", "pools",)

Это работает нормально, но проблема в том, что поле pools может содержать тысячи значений. Похожий вопрос был задан здесь: Django: Поиск по полю "многие ко многим" при создании объекта

Я попробовал этот виджет, рекомендованный там https://github.com/ExoticObjects/django-better-filter-widget, но он кажется устаревшим...

Есть ли какая-нибудь альтернатива? Я знаю, что это можно сделать в админке, но я хочу сделать это в ModelForm.

Для этого есть autocomplete_fields: https://docs.djangoproject.com/en/3.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.autocomplete_fields

Таким образом, вы можете написать:

class FormulariMostra(ModelForm):
    class Meta:
        model = Sample
        autocomplete_fields = ["pools"]
        fields = ("name", "sample_id_sex", "pools",)

или есть также raw_id_fields https://docs.djangoproject.com/en/3.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.raw_id_fields

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