extra info the code of the autocomplete code:

class BaseAutocompleteWidget(ForeignKeyRawIdWidget):
    widget_template = None
    search_path = '../foreignkey_autocomplete/'
    
    class Media:
        css             = css_dict
        js              = js_tuple
        abstract        = True
    
    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)

class InlineForeignKeySearchWidget(BaseAutocompleteWidget):
    def __init__(self, rel, search_fields, attrs=None):
        self.search_fields = search_fields
        super(InlineForeignKeySearchWidget, self).__init__(rel, attrs)
        
    def render(self, name, value, attrs=None):
        if attrs is None:
            attrs = {}
        opts = self.rel.to._meta
        app_label = opts.app_label
        model_name = opts.object_name.lower()
        related_url = '../../../%s/%s/' % (app_label, model_name)
        params = self.url_parameters()
        if params:
            url = '?' + '&'.join(['%s=%s' % (k, v) for k, v in 
params.items()])
        else:
            url = ''
        if not attrs.has_key('class'):
            attrs['class'] = 'vForeignKeyRawIdHiddenAdminField'
        output = [forms.TextInput.render(self, name, value, attrs)]
        if value:
            label = self.label_for_value(value)
        else:
            label = u''
        context = {
            'url': url,
            'related_url': related_url,
            
            'search_path': self.search_path,
            'search_fields': ','.join(self.search_fields),
            'model_name': model_name,
            'app_label': app_label,
            'label': label,
            'name': name,
        }
        output.append(render_to_string(self.widget_template or (
            '%s/%s/%s' % (app_label, model_name, 'inline_widget.html'),
            '%s/%s' % (app_label, 'inline_widget.html'),
            'admin/myautocomplete/%s' % 'inline_widget.html',
        ), context))
        output.reverse()
        return mark_safe(u''.join(output))

class BaseAutocompleteAdminMixin(object):
    related_search_fields = {}
    related_string_functions = {}
    related_search_filters = {}
    
    class Meta:
        abstract = True
    
    def foreignkey_autocomplete(self, request):
        
        def _restrict_queryset(queryset, search_fields):
            for bit in search_fields.split(','):
                if bit[0] == '#':
                    key, val = bit[1:].split('=')
                    queryset = queryset.filter(**{key: val})
            return queryset
        
        query = request.GET.get('q', None)
        app_label = request.GET.get('app_label', None)
        model_name = request.GET.get('model_name', None)
        search_fields = request.GET.get('search_fields', None)
        object_pk = request.GET.get('object_pk', None)
        try:
            to_string_function = self.related_string_functions[model_name]
        except KeyError:
            to_string_function = lambda x: x.__unicode__()
        if search_fields and app_label and model_name and (query or 
object_pk):
            def construct_search(field_name):
                if field_name.startswith('^'):
                    return "%s__istartswith" % field_name[1:]
                elif field_name.startswith('='):
                    return "%s__iexact" % field_name[1:]
                elif field_name.startswith('@'):
                    return "%s__search" % field_name[1:]
                else:
                    return "%s__icontains" % field_name
            
            model = models.get_model(app_label, model_name)
            queryset = model._default_manager.all()
            data = ''
            if query:
                for bit in query.split():
                    or_queries = []
                    for field_name in search_fields.split(','):
                        if field_name[0] == "#":
                            continue
                        or_queries.append(
                            
models.Q(**{construct_search(smart_str(field_name)): smart_str(bit)}))
                    other_qs = QuerySet(model)
                    other_qs.dup_select_related(queryset)
                    other_qs = other_qs.filter(reduce(operator.or_, 
or_queries))
                    queryset = queryset & other_qs
                queryset = _restrict_queryset(queryset, search_fields)
                data = ''.join([u'%s|%s\n' % (
                    to_string_function(f), f.pk) for f in queryset])
            elif object_pk:
                try:
                    obj = queryset.get(pk=object_pk)
                except:
                    pass
                else:
                    data = to_string_function(obj)
            return HttpResponse(data)
        return HttpResponseNotFound()
    
    def get_help_text(self, field_name, model_name):
        searchable_fields = self.related_search_fields.get(field_name, None)
        if searchable_fields:
            help_kwargs = {
                'model_name': model_name,
                'field_list': get_text_list(searchable_fields, _('and')),
            }
            return _('Use the left field to do %(model_name)s lookups in 
the fields %(field_list)s.') % help_kwargs
        return ''


class InlineAutocompleteAdmin(BaseAutocompleteAdminMixin, 
admin.TabularInline):
    def formfield_for_dbfield(self, db_field, **kwargs):
        if (isinstance(db_field, models.ForeignKey) and 
            db_field.name in self.related_search_fields):
            model_name = db_field.rel.to._meta.object_name
            # help_text = self.get_help_text(db_field.name, model_name)
           
            kwargs['widget'] = InlineForeignKeySearchWidget(db_field.rel, 
self.related_search_fields[db_field.name])
            # kwargs['help_text'] = help_text
        return super(InlineAutocompleteAdmin, 
self).formfield_for_dbfield(db_field, **kwargs)
    
    def get_urls(self):
        urls = super(InlineAutocompleteAdmin, self).get_urls()
        search_url = patterns('',
            (r'^foreignkey_autocomplete/$', 
self.admin_site.admin_view(self.foreignkey_autocomplete))
        )
        return search_url + urls

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/django-users/-/CIipD99EumIJ.
To post to this group, send email to django-users@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to