Django-autocomplete-light基于两个字段过滤和显示结果

时间:2015-03-31 13:59:00

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

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

问题在于:

  • 让我们假设患者叫约翰史密斯。
  • 如果我输入" John" " Smith"出现正确的自动完成,我可以选择患者。
  • 然而 - 如果我输入" John S"或任何其他涉及输入姓名和姓氏的组合,自动填充变为空......
  • 我试图以不同方式过滤模型,例如将q分成" name"和"姓氏"并在相关领域用Q过滤模型,但这也没有帮助......

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

这是我简单模型的一部分(请注意,网址' 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得到了所有我在字段中输入的内容:

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>

关于如何向患者展示正确的输入的帮助,例如&#34; John Sm&#34;非常感谢!

2 个答案:

答案 0 :(得分:0)

这不是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并实现干草堆后端,或者redis ...

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

答案 1 :(得分:0)

如果简单查询(在单个字段上使用 .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