首页 > 解决方案 > Select2 and django_filters not querying foreign keys

问题描述

I'm using django_filters for an advanced search and select2Widget to display the options of a foreign key field.

The proper values load but whenever I submit the form I get an error message: Select a valid choice. That choice is not one of the available choices.

The error might seem pretty obvious but I can't find out how to solve it. Any suggestions?

filters.py

class MyFilter(django_filters.FilterSet):
    b = django_filters.ModelChoiceFilter(
        queryset=ModelA.objects.values_list('b__name', flat=True)
        widget=Select2Widget()
    )

class Meta:
    model = ModelA
    fields = ('b',)

models.py

class ModelA(models.Model):
    b = models.ForeignKey('ModelB', on_delete=models.CASCADE)

class ModelB(models.Model):
    name = models.CharField(max_length=100, unique=True)

    def __str__(self):
        return self.name

标签: pythondjangojquery-select2django-filters

解决方案


作为用户@dirkgroten 在对该问题的评论中指出,以下行看起来很奇怪:

queryset=ModelA.objects.values_list('b__name', flat=True)

这样,小部件就无法知道pk列表中每个元素的名称(因为它只返回名称)。这可能会导致视图无法保存选定的ModelB实例,因为它不知道选定的pk.

啊,您可能还想使用ModelB而不是ModelA

试着把它改成这样

queryset=ModelB.objects.values('pk', 'b__name')

甚至这个

queryset=ModelB.objects.all()

让我们知道这是否有效。


推荐阅读