【问题标题】:Django-autocomplete-light filtering and displaying results based on two fieldsDjango-autocomplete-light 根据两个字段过滤和显示结果
【发布时间】:2015-06-04 21:27:19
【问题描述】:

我是 django-autocomplete-light 的新手。我正在尝试实现类似“全局导航自动完成”(https://django-autocomplete-light.readthedocs.org/en/docs_rewrite/navigation.html#a-simple-view)之类的东西,但这将用于在患者之间导航。

问题来了:

  • 假设有一位名叫 John Smith 的患者。
  • 如果我输入“John”“Smith”,则会出现正确的自动完成功能,我可以选择患者。
  • 但是 - 如果我输入“John S”或任何其他涉及同时输入姓名和姓氏的组合,则自动完成功能将变为空...
  • 我尝试以不同的方式过滤模型,例如将 q 拆分为“name”和“surname”,并在相关字段上使用 Q 过滤模型,但这也无济于事......

我错过了哪一部分?过滤或自动完成是否无法处理基于给定模型中两个字段的过滤?

这是我的简单模型的一部分(请注意,url 'patient_detail' 存在并且工作正常,只是没有粘贴到这里):

class Patient(models.Model):
    name = models.CharField(max_length = 30, blank=False)
    surname = models.CharField(max_length = 70, blank=False)

    def __unicode__(self):
        return '%s %s' % (self.name, self.surname)

    def get_absolute_url(self):
        return reverse('patient_detail', kwargs = {'pk':self.pk})

在我看来,我正在这样做(类似于文档中描述的内容),其中 q get 是我在该字段中输入的所有内容:

def pacjent_autocomplete(request, template_name = 'reception_autocomplete.html'):
   q = request.GET.get('q','').strip()
   queries = {}
   queries['patients'] = Patient.objects.filter(Q(name__icontains=q) | Q(surname__icontains = q))
   return render(request, template_name, queries)

reception_autocomplete.html 文件如下所示:

<span class="separator">Patients</span>
{% for patient in patients %}
<a class="block choice" href="{{patient.get_absolute_url}}">{{patient}}</a>
{% endfor %}

在我的主视图中,我有一个字段是此脚本的目标:

   <script type="text/javascript">
    $(document).ready(function() {
        $('#id_new_patient').yourlabsAutocomplete({
            url: "{% url 'reception_autocomplete' %}",
            choiceSelector: 'a',
        }).input.bind('selectChoice', function(e, choice, autocomplete) {
            document.location.href = choice.attr('href');
        });
    });
    </script>

非常感谢您对如何向正确的患者展示“John Sm”等输入的帮助!

【问题讨论】:

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


    【解决方案1】:

    这不是 autocomplete_light 的问题,而是您的 Django 查询:

    Patient.objects.filter(Q(name__icontains=q) | Q(surname__icontains = q))
    

    这将选择所有具有surname__icontains="John S" name__icontains="John S" 的患者。这就是为什么你没有结果。检查 django-cities-light 是如何搜索的:https://github.com/yourlabs/django-cities-light/blob/stable/3.x.x/cities_light/abstract_models.py

    或者使用 django-haystack 并实现一个 haystack 后端,或者 redis...

    或者,回退到 choices_for_request 中的原始 sql 以过滤姓名和姓氏的串联。

    【讨论】:

    • 非常感谢您的精彩解释!
    【解决方案2】:

    如果一个简单的查询(在单个字段上使用.filter())或一个使用Q复杂(参见@jpic 的答案)不符合您的需求,您也可以使用Django 的搜索功能(仅适用于 Postgres),尤其是 SearchVector

    它将允许您组合多个要搜索的字段。

    >>> from django.contrib.postgres.search import SearchVector
    >>> Entry.objects.annotate(
    ...     search=SearchVector('body_text', 'blog__tagline'),
    ... ).filter(search='Cheese')
    [<Entry: Cheese on Toast recipes>, <Entry: Pizza Recipes>]
    

    https://docs.djangoproject.com/en/3.1/topics/db/search/#document-based-searchhttps://docs.djangoproject.com/en/3.1/ref/contrib/postgres/search/#django.contrib.postgres.search.SearchVector

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 2016-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-24
      • 2016-10-21
      相关资源
      最近更新 更多