django-autocomplete-light 根据两个字段过滤并显示结果
Django-autocomplete-light filtering and displaying results based on two fields
我是 django-autocomplete-light 的新手。我正在尝试实现类似 "global navigation autocomplete" (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 是我在字段中输入的全部内容:
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"!
这不是 autocomplete_light 的问题,而是您的 Django 查询:
Patient.objects.filter(Q(name__icontains=q) | Q(surname__icontains = q))
那将 select 所有具有 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 以过滤姓名和姓氏的串联。
如果简单查询(在单个字段上使用 .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-search and https://docs.djangoproject.com/en/3.1/ref/contrib/postgres/search/#django.contrib.postgres.search.SearchVector
我是 django-autocomplete-light 的新手。我正在尝试实现类似 "global navigation autocomplete" (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 是我在字段中输入的全部内容:
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"!
这不是 autocomplete_light 的问题,而是您的 Django 查询:
Patient.objects.filter(Q(name__icontains=q) | Q(surname__icontains = q))
那将 select 所有具有 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 以过滤姓名和姓氏的串联。
如果简单查询(在单个字段上使用 .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-search and https://docs.djangoproject.com/en/3.1/ref/contrib/postgres/search/#django.contrib.postgres.search.SearchVector