from django import forms
from django.conf import settings
from django.utils.safestring import mark_safe
from django.utils.text import truncate_words
class ForeignKeySearchInput(forms.HiddenInput):
"""
A Widget for displaying ForeignKeys in an autocomplete search input
instead in a ``select`` box.
"""
class Media:
css = {
'all': (settings.MEDIA_URL + 'css/jquery.autocomplete.css',)
}
js = (
settings.MEDIA_URL + 'js/lib/jquery.js',
settings.MEDIA_URL + 'js/lib/jquery.bgiframe.min.js',
settings.MEDIA_URL + 'js/lib/jquery.ajaxQueue.js',
settings.MEDIA_URL + 'js/jquery.autocomplete.js'
)
def label_for_value(self, value):
key = self.rel.get_related_field().name
obj = self.rel.to._default_manager.get(**{key: value})
return truncate_words(obj, 14)
def __init__(self, rel, search_fields, attrs=None):
self.rel = rel
self.search_fields = search_fields
super(ForeignKeySearchInput, self).__init__(attrs)
def render(self, name, value, attrs=None):
if attrs is None:
attrs = {}
rendered = super(ForeignKeySearchInput, self).render(name, value, attrs)
if value:
label = self.label_for_value(value)
else:
label = u''
return rendered + mark_safe(u'''
''') % {
'search_fields': ','.join(self.search_fields),
'admin_media_prefix': settings.ADMIN_MEDIA_PREFIX,
'model_name': self.rel.to._meta.module_name,
'app_label': self.rel.to._meta.app_label,
'label': label,
'name': name,
}