Gatis Tomsons

ruby, web, linux, mtb

Django AutoCompleteField

Tie, kuri izmanto Django savu web lapu izstrādē, vai arī vēlas to izmantot iespējams zin, ka kādu laiciņu jau ir pieejama jauna formu veidošanas bibliotēka newforms. Viens no jauninājumiem ir tas, ka ir iespējams norādīt widgetu katram formas elementam. Widgets var būt kāds no jau esošajiem, kā arī pašu veidots.

Tā, kā es esmu sācis izmantot script.aculo.us javascript bibliotēku, tad radās nepieciešamība izmantot burvīgo Ajax.Autocompleter lauku arī iekš Django, tad nu rezultāts ir sekojošs.

from django import newforms as forms
from django.newforms.widgets import TextInput,flatatt
from django.newforms.util import smart_unicode
from django.utils.html import escape

class AutoCompleteField(TextInput):
	def __init__(self,url='', options='{}',attrs={}):
		self.url	 = url
		self.options = options
		self.attrs	 = attrs
	
	def render(self, name, value=None, attrs=None):
		final_attrs = self.build_attrs(attrs, name=name)
		if value:
			value = smart_unicode(value)
			final_attrs['value'] = escape(value)
		if not self.attrs.has_key('id'): final_attrs['id'] = 'id_%s' % name	
		return u'<input /> <div class="autocomplete" id="box_%(name)s"></div> <script type="text/javascript">new Ajax.Autocompleter(\'%(id)s\', \'box_%(name)s\', \'%(url)s\', %(options)s);</script>' % {
			'attrs'	: flatatt(final_attrs),
			'name'	: name,
			'id'	: final_attrs['id'],
			'url'	: self.url,
			'options' : self.options
		}

Lai izmantotu šo widgetu, to nepieciešams saglabāt savā projektā un importēt attiecīgā vietā.

from myproject.widgets import AutoCompleteField
.....
person	= forms.CharField(label='Person',required=False,widget=AutoCompleteField(url='/person/autocomplete/'))
.....

Tik nevajadzētu piemirst, ka vispirms lapas head ir jaievieto attiecīgie javascript faili.