1 |
|
---|
2 | -- views.py ------------
|
---|
3 |
|
---|
4 | from django.http import HttpResponse, HttpResponseBadRequest
|
---|
5 | from django.views.decorators.cache import cache_page
|
---|
6 | from django.db.models import Q
|
---|
7 |
|
---|
8 | # from http://www.djangosnippets.org/snippets/233/
|
---|
9 | # generalized for variable queryset and fieldname
|
---|
10 |
|
---|
11 | def autocomplete(request, queryset, searchfields=[], resultfields=[]):
|
---|
12 | if resultfields:
|
---|
13 | fields = resultfields
|
---|
14 | else:
|
---|
15 | fields = []
|
---|
16 | for searchfield in searchfields:
|
---|
17 | if '__' in searchfield:
|
---|
18 | fields.append(searchfield[:searchfield.index('__')])
|
---|
19 | else:
|
---|
20 | fields.append(searchfield)
|
---|
21 |
|
---|
22 | def iter_results(results):
|
---|
23 | if results:
|
---|
24 | for r in results:
|
---|
25 | result = ''
|
---|
26 | for field in fields:
|
---|
27 | value = getattr(r, field)
|
---|
28 | if result:
|
---|
29 | result += '|%s' % value
|
---|
30 | else:
|
---|
31 | result = '%s' % value
|
---|
32 | yield '%s\n' % result
|
---|
33 |
|
---|
34 | if not request.GET.get('q'):
|
---|
35 | return HttpResponse(mimetype='text/plain')
|
---|
36 |
|
---|
37 | q = request.GET.get('q')
|
---|
38 | limit = request.GET.get('limit', 15)
|
---|
39 |
|
---|
40 | try:
|
---|
41 | limit = int(limit)
|
---|
42 | except ValueError:
|
---|
43 | return HttpResponseBadRequest()
|
---|
44 |
|
---|
45 | qs = None
|
---|
46 |
|
---|
47 | for searchfield in searchfields:
|
---|
48 | kwargs = {}
|
---|
49 | if '__' in searchfield:
|
---|
50 | kwargs[searchfield] = q
|
---|
51 | else:
|
---|
52 | kwargs['%s__istartswith' % searchfield] = q
|
---|
53 | if qs:
|
---|
54 | qs = qs | Q(**kwargs)
|
---|
55 | else:
|
---|
56 | qs = Q(**kwargs)
|
---|
57 |
|
---|
58 | object_list = queryset.filter(qs)[:limit]
|
---|
59 | return HttpResponse(iter_results(object_list), mimetype='text/plain')
|
---|
60 |
|
---|
61 | autocomplete = cache_page(autocomplete, 60 * 60)
|
---|
62 |
|
---|
63 |
|
---|
64 |
|
---|
65 |
|
---|
66 |
|
---|
67 | -- urls.py ---------
|
---|
68 |
|
---|
69 | # -*- coding: utf-8 -*-
|
---|
70 |
|
---|
71 | from django.conf.urls.defaults import *
|
---|
72 | from models import *
|
---|
73 |
|
---|
74 | besuch = {
|
---|
75 | 'queryset': Besuch.objects.filter(besuchsende__isnull=True).order_by('besuchsbeginn'),
|
---|
76 | 'searchfields': ['besucher__name__icontains', 'besucher__firma__name__icontains', 'besuchsempfaenger__name__icontains', 'besuchsziel__ort__icontains'],
|
---|
77 | 'resultfields': ['id', 'besucher', 'besuchsempfaenger', 'besuchsziel', 'besuchsbeginn']
|
---|
78 | }
|
---|
79 |
|
---|
80 | urlpatterns += patterns('views',
|
---|
81 | (r'^besuch/search/$', 'autocomplete', besuch ),
|
---|
82 | )
|
---|
83 |
|
---|