mirror of
https://github.com/Hopiu/django-select2.git
synced 2026-03-16 21:40:23 +00:00
51 lines
1.6 KiB
Python
51 lines
1.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
from __future__ import absolute_import, unicode_literals
|
|
|
|
from django.core import signing
|
|
from django.core.signing import BadSignature
|
|
from django.http import Http404, JsonResponse
|
|
from django.utils.encoding import smart_text
|
|
from django.views.generic.list import BaseListView
|
|
|
|
from .cache import cache
|
|
from .conf import settings
|
|
from .types import NO_ERR_RESP
|
|
|
|
|
|
class AutoResponseView(BaseListView):
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
self.widget = self.get_widget_or_404()
|
|
self.term = kwargs.get('term', request.GET.get('term', ''))
|
|
self.object_list = self.get_queryset()
|
|
context = self.get_context_data()
|
|
return JsonResponse({
|
|
'results': [
|
|
{
|
|
'text': smart_text(obj),
|
|
'id': obj.pk,
|
|
}
|
|
for obj in context['object_list']
|
|
],
|
|
})
|
|
|
|
def get_queryset(self):
|
|
return self.widget.filter_queryset(self.term)
|
|
|
|
def get_paginate_by(self, queryset):
|
|
return self.widget.max_results
|
|
|
|
def get_widget_or_404(self):
|
|
field_id = self.kwargs.get('field_id', self.request.GET.get('field_id', None))
|
|
if not field_id:
|
|
raise Http404('No "field_id" provided.')
|
|
try:
|
|
key = signing.loads(field_id)
|
|
except BadSignature:
|
|
raise Http404('Invalid "field_id".')
|
|
else:
|
|
cache_key = '%s%s' % (settings.SELECT2_CACHE_PREFIX, key)
|
|
field = cache.get(cache_key)
|
|
if field is None:
|
|
raise Http404('field_id not found')
|
|
return field
|