1

I was using the django_ajax library for ajax lookup in one of the form elements.

The model:

class Alpha(models.Model):
    name = models.CharField()
    description = models.TextField()
    submitted = models.BooleanField(default=False)

The form

class MyForm(forms.Form):
    alpha = AutoCompleteSelectField('alpha')

    def __init__(self, loser, *args, **kwargs):
        super(MyForm, self).__init__(*args, **kwargs)
        self.loser = loser
        self.fields['alpha'].widget.attrs['class'] = 'big-text-box'

The problem with the current implementation is it shows me all the alpha entries, but in the lookup field i want only those alphas whose submitted is false.

How do I write a selector?

whatf
  • 6,378
  • 14
  • 49
  • 78

1 Answers1

2

As is explained in the README of the project, you can achieve your goal using a custom lookup class.

Create a file lookups.py (the name is conventional) in your app directory, and define the following class in it:

from ajax_select import LookupChannel
from django.utils.html import escape
from django.db.models import Q
from yourapp.models import *

class AlphaLookup(LookupChannel):

    model = Alpha

    def get_query(self,q,request):
        # The real query
        # Here the filter will select only non-submitted entries
        return Alpha.objects.filter(Q(name__icontains = q) & Q(submitted = false)).order_by('name')

    def get_result(self,obj):
        u""" result is the simple text that is the completion of what the person typed """
        return obj.name

    def format_match(self,obj):
        """ (HTML) formatted item for display in the dropdown """
        return escape(obj.name)

    def format_item_display(self,obj):
        """ (HTML) formatted item for displaying item in the selected deck area """
        return escape(obj.name)

Note that raw strings should always be escaped with the escape() function in format_match and format_item_display.

The crucial thing, in your case, is the get_query method. The filter applied on Alpha.objects selects only non-submitted entries.

Do not forget to update your settings.py to use the lookup class instead of the default behavior:

AJAX_LOOKUP_CHANNELS = {
    'alpha' : ('yoursite.yourapp.lookups', 'AlphaLookup'),
}
sjrd
  • 21,805
  • 2
  • 61
  • 91