AutocompleteGeneric, for GenericForeignKey or GenericManyToMany

Generic relation support comes in two flavors:

  • for django’s generic foreign keys,
  • and for django-generic-m2m’s generic many to many in autocomplete_light.contrib.generic_m2m,

AutocompleteGeneric

Example using AutocompleteGeneric as shown in test_project/gfk_autocomplete/autocomplete_light_registry.py:

import autocomplete_light
from cities_light.models import Country, City
from django.contrib.auth.models import User, Group


class AutocompleteTaggableItems(autocomplete_light.AutocompleteGenericBase):
    choices = (
        User.objects.all(),
        Group.objects.all(),
        City.objects.all(),
        Country.objects.all(),
    )

    search_fields = (
        ('username', 'email'),
        ('name',),
        ('search_names',),
        ('name_ascii',),
    )


autocomplete_light.register(AutocompleteTaggableItems)

GenericModelForm and GenericModelChoiceField

Example using GenericModelForm and GenericModelChoiceField as shown in test_project/gfk_autocomplete/forms.py:

from django import forms

import autocomplete_light

from models import TaggedItem


class TaggedItemForm(autocomplete_light.GenericModelForm):
    content_object = autocomplete_light.GenericModelChoiceField(
        widget=autocomplete_light.ChoiceWidget(
            autocomplete='AutocompleteTaggableItems',
            autocomplete_js_attributes={'minimum_characters': 0}))

    class Meta:
        model = TaggedItem
        exclude = ('content_type', 'object_id')

GenericManyToMany

Example

Consider this example model with a generic many-to-many relation descriptor related as in test_project/generic_m2m_autocomplete/models.py:

from django.db import models
from django.db.models import signals
from django.contrib.contenttypes import generic

from genericm2m.models import RelatedObjectsDescriptor

class ModelGroup(models.Model):
    name = models.CharField(max_length=100)

    related = RelatedObjectsDescriptor()

    def __unicode__(self):
        return self.name

Example GenericModelForm and GenericModelMultipleChoiceField usage as per test_project/generic_m2m_autocomplete/forms.py:

import autocomplete_light
from autocomplete_light.contrib.generic_m2m import GenericModelForm, \
    GenericModelMultipleChoiceField

from models import ModelGroup


class ModelGroupForm(GenericModelForm):
    """
    Use AutocompleteTaggableItems defined in
    gfk_autocomplete.autocomplete_light_registry.
    """

    related = GenericModelMultipleChoiceField(
        widget=autocomplete_light.MultipleChoiceWidget(
            'AutocompleteTaggableItems'))

    class Meta:
        model = ModelGroup

The form defined above can directly be using in the admin:

from django.contrib import admin

from models import ModelGroup
from forms import ModelGroupForm


class ModelGroupAdmin(admin.ModelAdmin):
    form = ModelGroupForm
admin.site.register(ModelGroup, ModelGroupAdmin)