How to filter choices in Django2's autocomplete_fields?

How to filter choices in Django2's autocomplete_fields?

In Django 2, the autocomplete_fields feature allows you to create autocomplete fields using the ForeignKey or OneToOneField relationship in your admin forms. If you want to filter the choices shown in the autocomplete dropdown, you can use the limit_choices_to attribute in your model's field definition.

Here's how you can use autocomplete_fields and filter choices in Django 2:

  1. Define the Model:

    First, define your model with a ForeignKey or OneToOneField relationship, and use the limit_choices_to attribute to specify the filtering criteria.

    from django.db import models
    
    class Author(models.Model):
        name = models.CharField(max_length=100)
    
    class Book(models.Model):
        title = models.CharField(max_length=100)
        author = models.ForeignKey(Author, on_delete=models.CASCADE)
    
  2. Configure autocomplete_fields in Admin:

    In your admin class, use the autocomplete_fields attribute to specify which fields should have autocomplete functionality.

    from django.contrib import admin
    from .models import Book
    
    class BookAdmin(admin.ModelAdmin):
        autocomplete_fields = ['author']  # Enable autocomplete for the 'author' field
    
    admin.site.register(Book, BookAdmin)
    
  3. Filter Choices Using limit_choices_to:

    To filter the choices displayed in the autocomplete dropdown, use the limit_choices_to attribute in your model's field definition. This attribute takes a dictionary of lookup conditions.

    class Book(models.Model):
        title = models.CharField(max_length=100)
        author = models.ForeignKey(
            Author,
            on_delete=models.CASCADE,
            limit_choices_to={'name__startswith': 'J'}  # Example filtering criteria
        )
    

    In this example, the autocomplete dropdown for the author field will only display authors whose names start with the letter 'J'.

Remember to replace the filtering criteria ({'name__startswith': 'J'} in the example) with the conditions that match your use case.

By combining the autocomplete_fields feature with the limit_choices_to attribute, you can create autocomplete fields with filtered choices in Django 2's admin interface.

Examples

  1. "Django2 autocomplete_fields filter choices" Description: This query aims to filter choices displayed in Django2's autocomplete_fields based on certain criteria.

    # models.py
    from django.db import models
    
    class YourModel(models.Model):
        name = models.CharField(max_length=100)
        related_model = models.ForeignKey('RelatedModel', on_delete=models.CASCADE)
    
    class RelatedModel(models.Model):
        related_name = models.CharField(max_length=100)
    
    # admin.py
    from django.contrib import admin
    from .models import YourModel
    
    class YourModelAdmin(admin.ModelAdmin):
        autocomplete_fields = ['related_model']
    
    admin.site.register(YourModel, YourModelAdmin)
    
  2. "Django2 autocomplete_fields custom queryset" Description: This query is about customizing the queryset for autocomplete_fields in Django2 admin to filter choices dynamically.

    # admin.py
    from django.contrib import admin
    from .models import YourModel, RelatedModel
    
    class YourModelAdmin(admin.ModelAdmin):
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == 'related_model':
                kwargs['queryset'] = RelatedModel.objects.filter(custom_criteria=True)
            return super().formfield_for_foreignkey(db_field, request, **kwargs)
    
    admin.site.register(YourModel, YourModelAdmin)
    
  3. "Django2 autocomplete_fields limit choices" Description: This query seeks a method to limit the choices displayed in autocomplete_fields in Django2 admin.

    # admin.py
    from django.contrib import admin
    from .models import YourModel
    
    class YourModelAdmin(admin.ModelAdmin):
        autocomplete_fields = ['related_model']
    
        def get_search_results(self, request, queryset, search_term):
            queryset, use_distinct = super().get_search_results(request, queryset, search_term)
            queryset = queryset.filter(custom_criteria=True)
            return queryset, use_distinct
    
    admin.site.register(YourModel, YourModelAdmin)
    
  4. "Django2 autocomplete_fields filter by user" Description: This query involves filtering choices in autocomplete_fields based on the logged-in user in Django2 admin.

    # admin.py
    from django.contrib import admin
    from .models import YourModel
    
    class YourModelAdmin(admin.ModelAdmin):
        autocomplete_fields = ['related_model']
    
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == 'related_model':
                kwargs['queryset'] = db_field.related_model.objects.filter(user=request.user)
            return super().formfield_for_foreignkey(db_field, request, **kwargs)
    
    admin.site.register(YourModel, YourModelAdmin)
    
  5. "Django2 autocomplete_fields dynamic choices" Description: This query seeks a way to dynamically change the choices displayed in autocomplete_fields based on certain conditions.

    # admin.py
    from django.contrib import admin
    from .models import YourModel, RelatedModel
    
    class YourModelAdmin(admin.ModelAdmin):
        def get_search_results(self, request, queryset, search_term):
            queryset, use_distinct = super().get_search_results(request, queryset, search_term)
            if 'related_model' in request.GET:
                related_model_id = request.GET.get('related_model')
                queryset = queryset.filter(related_model_id=related_model_id)
            return queryset, use_distinct
    
    admin.site.register(YourModel, YourModelAdmin)
    
  6. "Django2 autocomplete_fields exclude choices" Description: This query involves excluding certain choices from autocomplete_fields in Django2 admin.

    # admin.py
    from django.contrib import admin
    from .models import YourModel, RelatedModel
    
    class YourModelAdmin(admin.ModelAdmin):
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == 'related_model':
                kwargs['queryset'] = RelatedModel.objects.exclude(some_condition=True)
            return super().formfield_for_foreignkey(db_field, request, **kwargs)
    
    admin.site.register(YourModel, YourModelAdmin)
    
  7. "Django2 autocomplete_fields filter by related object" Description: This query aims to filter choices in autocomplete_fields based on related objects in Django2 admin.

    # admin.py
    from django.contrib import admin
    from .models import YourModel
    
    class YourModelAdmin(admin.ModelAdmin):
        autocomplete_fields = ['related_model']
    
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == 'related_model':
                kwargs['queryset'] = db_field.related_model.objects.filter(some_condition=True)
            return super().formfield_for_foreignkey(db_field, request, **kwargs)
    
    admin.site.register(YourModel, YourModelAdmin)
    
  8. "Django2 autocomplete_fields dynamic queryset" Description: This query involves dynamically changing the queryset for autocomplete_fields based on user actions or other conditions.

    # admin.py
    from django.contrib import admin
    from .models import YourModel, RelatedModel
    
    class YourModelAdmin(admin.ModelAdmin):
        def get_search_results(self, request, queryset, search_term):
            queryset, use_distinct = super().get_search_results(request, queryset, search_term)
            # Customize queryset dynamically here
            return queryset, use_distinct
    
    admin.site.register(YourModel, YourModelAdmin)
    
  9. "Django2 autocomplete_fields filter by date" Description: This query seeks a method to filter choices in autocomplete_fields based on dates or date-related criteria.

    # admin.py
    from django.contrib import admin
    from .models import YourModel, RelatedModel
    
    class YourModelAdmin(admin.ModelAdmin):
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == 'related_model':
                kwargs['queryset'] = RelatedModel.objects.filter(date_field__gte=some_date)
            return super().formfield_for_foreignkey(db_field, request, **kwargs)
    
    admin.site.register(YourModel, YourModelAdmin)
    
  10. "Django2 autocomplete_fields filter by related object field" Description: This query involves filtering choices in autocomplete_fields based on fields of related objects in Django2 admin.

    # admin.py
    from django.contrib import admin
    from .models import YourModel, RelatedModel
    
    class YourModelAdmin(admin.ModelAdmin):
        autocomplete_fields = ['related_model']
    
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == 'related_model':
                kwargs['queryset'] = RelatedModel.objects.filter(related_field=some_value)
            return super().formfield_for_foreignkey(db_field, request, **kwargs)
    
    admin.site.register(YourModel, YourModelAdmin)
    

More Tags

mapstruct subdirectory new-window azure-api-apps url.action html-datalist page-break ear apache-commons-config azure-devops

More Python Questions

More Cat Calculators

More Electrochemistry Calculators

More Chemistry Calculators

More Dog Calculators