Skip to content

Supports the dependence of one AutoCompleteSelectField upon the choice of another AutoCompleteSelectField.

Notifications You must be signed in to change notification settings

FinalsClub/django-ajax-selects-cascade

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

django-ajax-selects-cascade

Supports the dependence of one AutoCompleteSelectField upon the choice of another AutoCompleteSelectField.

Requires django-ajax-selects in the Django environment.

Installation

In settings.py:

        INSTALLED_APPS = (
        ...
        'ajax_select',
        'ajax_select_cascade',
        ...

Use

Here's an example to choose a phone's make, model, and series. Read the form data as per usual Django methods.

DependentLookupChannel and Channel Decorator

I would put these into the models file, but it is flexible.

        from ajax_select import LookupChannel
        from ajax_select_cascade import DependentLookupChannel
        from ajax_select_cascade import register_channel_name

        # Channel name corresponds to channel used by AutoCompleteSelectField.
        @register_channel_name('ajax_autocomplete_phonemake')
        def MakeLookup(LookupChannel):
            # PhoneMake is a Django Model defined somewhere.
            # It has a name field.
            model = PhoneMake

            def get_query(self, q, request):
                # Filter the query against PhoneMake.name
                return self.model.objects.filter(name=q)

        @register_channel_name('ajax_autocomplete_phonemodel')
        def ModelGivenMakeLookup(DependentLookupChannel):
            # PhoneModel is a Django Model defined somewhere.
            # It has a name field and a ForeignKey to PhoneMake called make.
            model = PhoneModel

            def get_dependent_query(self, q, request, dependency):
                # Filter the query against PhoneModel.name
                # after filtering the dependency against PhoneMake.
                return self.model.objects.filter(make__id=dependency, name=q)

        @register_channel_name('ajax_autocomplete_phoneseries')
        def SeriesGivenModelLookup(DependentLookupChannel):
            # PhoneSeries is a Django Model defined somewhere.
            # It has a name field and a ForeignKey to PhoneModel called model.
            model = PhoneSeries

            def get_dependent_query(self, q, request, dependency):
                # Filter the query against PhoneSeries.name
                # after filtering the dependency against PhoneModel.
                return self.model.objects.filter(model__id=dependency, name=q)

Forms

        from ajax_select.fields import AutoCompleteSelectField
        from ajax_select_cascade.fields import AutoCompleteDependentSelectField

        # Choose phone make from all available phone makes
        class PhoneMakeForm(Form):
            # AutoCompleteSelectField('channel')
            # note that this field is not accessed as PhoneMakeForm.name,
            # but as PhoneMakeForm.declared_fields['name'] :(
            name = AutoCompleteSelectField('ajax_autocomplete_phonemake')

        # Choose phone model from the subset of models available for the given
        # make.
        class PhoneModelForm(ModelForm):
            # AutoCompleteDependentSelectField('channel', kwargs)
            name = AutoCompleteDependentSelectField('ajax_autocomplete_phonemodel',
                                   dependsOn=PhoneMakeForm.declared_fields['name'])

        # Choose phone series from the subset of series available for the given
        # model.
        class PhoneSeriesForm(ModelForm):
            # AutoCompleteDependentSelectField('channel', kwargs)
            name = AutoCompleteDependentSelectField('ajax_autocomplete_phoneseries',
                                   dependsOn=PhoneModelForm.declared_fields['name'])

Forms (long hand)

        from ajax_select.fields import AutoCompleteSelectField
        from ajax_select.fields import AutoCompleteSelectWidget
        from ajax_select_cascade.fields import AutoCompleteDependentSelectField
        from ajax_select_cascade.fields import AutoCompleteDependentSelectWidget
        
        # Choose phone make from all available phone makes
        class PhoneMakeForm(Form):
            # AutoCompleteSelectField('channel', widget)
            # AutoCompleteSelectWidget('channel', attrs)
            name = AutoCompleteSelectField('ajax_autocomplete_phonemake',
                widget=AutoCompleteSelectWidget(
                    'ajax_autocomplete_phonemake',
                    attrs={
                        # For anyone who cares, I am a make
                        'id': 'dom_autocomplete_phonemake'
                    }
                )
            )
        
        # Choose phone model from the subset of models available for the given
        # make.
        class PhoneModelForm(ModelForm):
            # AutoCompleteDependentSelectField('channel', widget)
            # AutoCompleteDependentSelectWidget('channel', attrs)
            name = AutoCompleteDependentSelectField('ajax_autocomplete_phonemodel',
                widget=AutoCompleteDependentSelectWidget(
                    'ajax_autocomplete_phonemodel',
                    attrs={
                        # For anyone who cares, I am a model
                        'id': 'dom_autocomplete_phonemodel',
                        # My returned data depends on the phone make
                        'data-upstream-id': 'dom_autocomplete_phonemake'
                    }
                )
            )
        
            class Meta:
                model = PhoneModel
        
        # Choose phone series from the subset of series available for the given
        # model.
        class PhoneSeriesForm(ModelForm):
            # AutoCompleteDependentSelectField('channel', widget)
            # AutoCompleteDependentSelectWidget('channel', attrs)
            name = AutoCompleteDependentSelectField('ajax_autocomplete_phoneseries',
                widget=AutoCompleteDependentSelectWidget(
                    'ajax_autocomplete_phoneseries', attrs={
                        # My returned data depends on the phone model
                        'data-upstream-id': 'dom_autocomplete_phonemodel'
                    }
                )
            )
        
            class Meta:
                model = PhoneModel

About

Supports the dependence of one AutoCompleteSelectField upon the choice of another AutoCompleteSelectField.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published