Django自动完成 - 案例敏感性问题

时间:2016-11-15 17:40:02

标签: django-models django-forms django-autocomplete-light

我在其中一个表单上创建了自动完成灯的基本设置。我使用直接SQL查询来访问我需要的数据,并使用Select2ListView将数据发送到模板。自动填充数据在浏览器中可用,但区分大小写。有人可以建议我可以做些什么来使自动完成灯变得 敏感吗?

我读过有关使用' split_words = True'来自AutocompleteModel类,但我不知道如何做到这一点。

例如(q =' ger'):

命令提示符(views.py print statement)返回

  

['阿尔及利亚'' 德国','尼日尔(尼日利亚)'尼日利亚']

http://127.0.0.1:8000/autocomplete/country-autocomplete?q=ger返回

  

{"结果":[{" text":" Algeria"," id":" Algeria" },{" text":" Niger(the)"," id":" Niger(the)"},{& #34;文字":"尼日利亚"," id":"尼日利亚"}]}

正如您所看到的,德国在我从视图中返回的数据中可见,但是自动完成光还会进行一些额外的过滤。我需要更改autocomplete-light,以便它执行的过滤不区分大小写。有什么想法吗?

我正在运行Python 3.5.2,以及autocomplete-light的最新pip安装。

由于 斯蒂芬

查看

class CountryAutocomplete(autocomplete.Select2ListView):
    def get_list(self):
    # Only allow authenticated users
    if not self.request.user.is_authenticated():
        return []

    # Read all country names from database
    cursor = connection.cursor()
    cursor.execute('SELECT country_name FROM autocomplete_iso3166;')
    results = cursor.fetchall()

    # Flatten database query into a list
    results = [e for l in results for e in l]

    # Check POST query and filter further
    if self.q:
        # Make query case insensitive
        results = list(filter(lambda k: self.q.casefold() in str(k).casefold(), results))

    print(results)
    return results

表格

    class VendorForm(forms.ModelForm):
    class Meta:
        model = client
        fields = [
            'vendor_name', 'address5', 'address4', 'address3', 'address2', 'address1',

            ]


    widgets = {
    'address5': autocomplete.ListSelect2(url='country-autocomplete'),
    'address4': autocomplete.ListSelect2(url='state-autocomplete',forward=['address5'])
    }

模型

class client(models.Model):
    vendor_name = models.CharField(max_length=100)
    user_admin = models.ForeignKey(User, unique=False, null=True, blank=True)
    address1 = models.CharField(null=True, blank=True, max_length=200)
    address2 = models.CharField(null=True, blank=True, max_length=50)
    address3 = models.CharField(null=True, blank=True, max_length=50)
    address4 = models.CharField(null=True, blank=True, max_length=50)
    address5 = models.CharField(null=True, blank=True, max_length=50)

1 个答案:

答案 0 :(得分:0)

if self.q:
    queryset = queryset.filter(country_name__istartswith=self.q)

我的意思是不区分大小写。此示例使用字段的开头。

如果您希望完全匹配不区分大小写,那么它将是:

country_name__iexact=self.q