Django

Code

AJAXForeignKey: views.py

File views.py, 2.1 kB (added by Michael Axiak <axiak@mit.edu>, 1 year ago)

Ajax View

Line 
1 from django.contrib.auth.decorators import login_required, user_passes_test
2 from django.core import serializers
3 from django.http import HttpResponse
4 from django.utils import simplejson
5 from django.db.models.query import QuerySet
6 from django.db import models
7
8 user_is_staff = user_passes_test(lambda u: u.is_staff and u.is_authenticated())
9
10 @user_is_staff
11 def ajax_autocomplete(request):
12     """
13     This function will recieve a bunch fo GET requests for the
14     AjaxForeignKey, and return the data for the autocompletion.
15     """
16     try:
17         limit = int(request.GET.get('limit',10))
18         model_module = request.GET['model_module']
19         model_name   = request.GET['model_name']
20         ajax_func    = request.GET.get('ajax_func', 'ajax_autocomplete')
21         data         = request.GET['ajax_data']
22     except KeyError, ValueError:
23         # bad request
24         response = HttpResponse('Malformed Input')
25         response.status_code = 400
26         return response
27
28     # import the model
29     Model = getattr(__import__(model_module,(),(),['']),model_name)
30
31     if not issubclass(Model, models.Model):
32         raise ValueError, "Required a model"
33
34     if hasattr(Model.objects, ajax_func):
35         query_set = getattr(Model.objects, ajax_func)(data)
36     else:
37         query_set = getattr(Model, ajax_func)(data)
38
39     if type(query_set) == QuerySet:
40         output = list(query_set[:limit])
41         output2 = []
42        
43         for item in output:
44             if hasattr(item, 'ajax_str'):
45                 ajax_str = item.ajax_str()
46             else:
47                 ajax_str = str(item)
48
49             output2.append({'id': item['id'], 'ajax_str': ajax_str+' (%s)' % item['id']})
50     else:
51         output = list(query_set[:limit])
52         output2 = []
53         for item in output:
54             output2.append({'id': item['id'], 'ajax_str': item['ajax_str']+' (%s)' % item['id']})
55        
56         content = simplejson.dumps({'result':output2})
57
58     return HttpResponse(content,
59                         mimetype = 'javascript/javascript')