首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用django-select2在下拉菜单中显示不同的值

使用django-select2在下拉菜单中显示不同的值
EN

Stack Overflow用户
提问于 2019-11-18 18:48:31
回答 2查看 735关注 0票数 1

我正在使用django-select2和表单来创建一个下拉列表,使用ModelSelect2Widget。

我的问题是,我过滤了字段'name‘,几个对象可以有相同的'name’但不同的'value‘(参见下面的模型描述)。这会导致同一名称在下拉菜单中出现多次。

我想删除这些副本。我尝试使用.distinct('name')来选择查询集,但似乎不起作用。example of result obtained with ModelSelect2Widget

下面是我使用的代码的描述:

我有两个通过外键链接的模型

代码语言:javascript
复制
models.py

class Who(models.Model):
    name = models.CharField(max_length=256)
    value = models.CharField(max_length=256)

    def __str__(self);
        return str(self.name)

class Data(models.Model):
    who = models.ForeignKey(Who)

我使用下面描述的形式:

代码语言:javascript
复制
forms.py

from django_select2.forms import ModelSelect2Widget
...

class CreateDataForm(ModelForm):
    class Meta:
        model = Data
        fields = ('who',)
        widgets = {'who': ModelSelect2Widget(
            queryset=Who.objects.all().distinct('name'),
            search_fields=['name_icontains']
        )}

有没有人知道我怎么删除这些重复的东西?

EN

回答 2

Stack Overflow用户

发布于 2019-11-18 21:55:39

我终于找到了问题的根源。

在django_select2 ModelSelect2Mixin中,用于过滤要在下拉菜单上显示的值的函数filter_queryset以"return queryset.filter(select).distinct()“结束。这个问题是这个名称(.distinct(“.distinct”))优先于来自查询集的名称()

为了解决我的问题,我必须覆盖filter queryset函数,并删除.distinct():

代码语言:javascript
复制
class ModelSelect2WidgetWithoutDistinct(ModelSelect2Widget):
    """In dropdown list, shows objects from queryset without the initial .distinct()."""

    def filter_queryset(self, request, term, queryset=None, **dependent_fields):
        """Same function as in select2 ModelSelect2Mixin except last line."""
        if queryset is None:
            queryset = self.get_queryset()
        search_fields = self.get_search_fields()
        select = Q()
        term = term.replace('\t', ' ')
        term = term.replace('\n', ' ')
        for t in [t for t in term.split(' ') if not t == '']:
            select &= reduce(lambda x, y: x | Q(**{y: t}), search_fields,
                                Q(**{search_fields[0]: t}))
        if dependent_fields:
            select &= Q(**dependent_fields)

        return queryset.filter(select)  # initially queryset.filter(select).distinct()
票数 1
EN

Stack Overflow用户

发布于 2019-11-18 19:00:41

代码语言:javascript
复制
# You can define queryset like this

class CreateDataForm(ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['who'].queryset = Who.objects.distinct()

    class Meta:
        model = Data
        fields = ('who',)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58912835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档