-- views.py ------------ from django.http import HttpResponse, HttpResponseBadRequest from django.views.decorators.cache import cache_page from django.db.models import Q # from http://www.djangosnippets.org/snippets/233/ # generalized for variable queryset and fieldname def autocomplete(request, queryset, searchfields=[], resultfields=[]): if resultfields: fields = resultfields else: fields = [] for searchfield in searchfields: if '__' in searchfield: fields.append(searchfield[:searchfield.index('__')]) else: fields.append(searchfield) def iter_results(results): if results: for r in results: result = '' for field in fields: value = getattr(r, field) if result: result += '|%s' % value else: result = '%s' % value yield '%s\n' % result if not request.GET.get('q'): return HttpResponse(mimetype='text/plain') q = request.GET.get('q') limit = request.GET.get('limit', 15) try: limit = int(limit) except ValueError: return HttpResponseBadRequest() qs = None for searchfield in searchfields: kwargs = {} if '__' in searchfield: kwargs[searchfield] = q else: kwargs['%s__istartswith' % searchfield] = q if qs: qs = qs | Q(**kwargs) else: qs = Q(**kwargs) object_list = queryset.filter(qs)[:limit] return HttpResponse(iter_results(object_list), mimetype='text/plain') autocomplete = cache_page(autocomplete, 60 * 60) -- urls.py --------- # -*- coding: utf-8 -*- from django.conf.urls.defaults import * from models import * besuch = { 'queryset': Besuch.objects.filter(besuchsende__isnull=True).order_by('besuchsbeginn'), 'searchfields': ['besucher__name__icontains', 'besucher__firma__name__icontains', 'besuchsempfaenger__name__icontains', 'besuchsziel__ort__icontains'], 'resultfields': ['id', 'besucher', 'besuchsempfaenger', 'besuchsziel', 'besuchsbeginn'] } urlpatterns += patterns('views', (r'^besuch/search/$', 'autocomplete', besuch ), )