Source code for tags_input.views
try: # pragma: no cover
from django.apps import apps
def get_model(app, model):
apps_config = apps.get_app_config(app)
return apps_config.get_model(model)
except ImportError: # pragma: no cover
from django.db import models
[docs] def get_model(app, model):
return models.get_model(app, model)
from django import http
try: # pragma: no cover
from django.utils import simplejson
except ImportError: # pragma: no cover
import json as simplejson
from . import utils
def _filter_func(queryset, field, term):
return queryset.filter(**{'%s__istartswith' % field: term})
[docs]def autocomplete(request, app, model, fields):
model = get_model(app, model)
mapping = utils.get_mapping(model)
fields = fields.split('-')
raw_queryset = (
mapping['queryset']
.filter(**mapping.get('filters', {}))
.exclude(**mapping.get('excludes', {}))
.values('pk', *fields)
.order_by(*mapping.get('ordering', fields))
)
autocomplete_filter = mapping.get('autocomplete_queryset_filter',
_filter_func)
term = request.GET.get('term')
if term:
queryset = mapping['queryset'].none()
for field in fields:
queryset |= autocomplete_filter(raw_queryset, field, term)
else:
queryset = raw_queryset
max_results = request.GET.get('max_results')
if max_results and max_results.isdigit():
max_results = int(max_results)
else:
max_results = 10
results = [mapping['join_func'](v)[1] for v in queryset[:max_results]]
if results:
response = simplejson.dumps(results),
else:
response = ''
return http.HttpResponse(response, content_type='application/javascript')