from django import oldforms from django.template.defaultfilters import addslashes from django.contrib.auth.models import User import re get_id_re = re.compile('\D*(\d+)\D$') class AjaxForeignKeyFormField(oldforms.FormField): def __init__(self, field_name, field, is_required=False, validator_list=None, member_name=None, ajax_func = None, width=None): self.field_name = field_name self.field = field self.is_required = is_required if width is None: self.width = '25em' else: self.width = width if ajax_func is None: self.ajax_func = 'ajax_autocomplete' else: self.ajax_func = ajax_func if validator_list is None: validator_list = [] self.validator_list = validator_list def extract_data(self, data): return data.get(self.field.attname, '') def render(self, data): """ Renders the actual ajax widget. """ old_init_val = init_val = data if data: objects = self.field.rel.to.objects.filter(pk = data) if objects.count() == 1: obj = objects[0] if hasattr(obj, 'ajax_str'): init_val = obj.ajax_str() + " (%s)" % data old_init_val = str(obj) else: old_init_val = init_val = obj.__str__() + " (%s)" % data else: data = init_val = '' fn = self.field_name related_model = self.field.rel.to # espuser hack if related_model == User: model_module = 'esp.users.models' model_name = 'ESPUser' else: model_module = related_model.__module__ model_name = related_model.__name__ javascript = """ """ % \ (fn, addslashes(init_val), fn, fn, fn, model_module, model_name, self.ajax_func, fn, fn, fn, fn, fn, fn, fn, fn, fn, fn, fn, fn, fn) css = """ """ % \ (fn,self.width,fn,fn,fn,fn,fn,fn,fn,fn,fn,fn) html = """