Show a ManyToManyField as Checkboxes in Django Admin

Show a ManyToManyField as Checkboxes in Django Admin

To display a ManyToManyField as checkboxes in the Django admin interface, you can use the filter_horizontal or filter_vertical option in your admin class. These options allow you to control the widget used for ManyToManyField relationships in the admin.

Here's how to use filter_horizontal and filter_vertical:

  • Using filter_horizontal (Displays checkboxes horizontally):
from django.contrib import admin from .models import YourModel class YourModelAdmin(admin.ModelAdmin): filter_horizontal = ('your_m2m_field',) admin.site.register(YourModel, YourModelAdmin) 
  • Using filter_vertical (Displays checkboxes vertically):
from django.contrib import admin from .models import YourModel class YourModelAdmin(admin.ModelAdmin): filter_vertical = ('your_m2m_field',) admin.site.register(YourModel, YourModelAdmin) 

In both cases, replace YourModel with the name of your model and your_m2m_field with the name of the ManyToManyField you want to display as checkboxes.

Choose either filter_horizontal or filter_vertical based on your preferred layout. When you specify one of these options in your admin class, Django will render the ManyToManyField as checkboxes in the admin interface, making it easy to select multiple related items.

Remember to customize the admin class according to your specific model and application requirements.

Examples

  1. How to Display ManyToManyField as Checkboxes in Django Admin

    • Description: Learn how to use filter_horizontal or filter_vertical in Django admin to display ManyToMany relationships as checkboxes.
    • Code:
      from django.contrib import admin from myapp.models import Author, Book class BookAdmin(admin.ModelAdmin): filter_horizontal = ('authors',) # Display as horizontal checkboxes admin.site.register(Book, BookAdmin) 
  2. Using filter_vertical for Vertical Checkbox Layout

    • Description: Use filter_vertical in Django admin to display ManyToMany relationships with vertical checkboxes.
    • Code:
      from django.contrib import admin from myapp.models import Author, Book class BookAdmin(admin.ModelAdmin): filter_vertical = ('authors',) # Display as vertical checkboxes admin.site.register(Book, BookAdmin) 
  3. Displaying Related Models with ManyToManyField in Django Admin

    • Description: Display related models in Django admin using ManyToMany relationships and checkboxes.
    • Code:
      from django.contrib import admin from myapp.models import Category, Product class ProductAdmin(admin.ModelAdmin): filter_horizontal = ('categories',) # Show categories as checkboxes admin.site.register(Product, ProductAdmin) 
  4. Limiting Choices for ManyToManyField in Django Admin

    • Description: Restrict the available choices for a ManyToManyField in Django admin.
    • Code:
      from django.contrib import admin from myapp.models import Tag, Post class PostAdmin(admin.ModelAdmin): filter_horizontal = ('tags',) def formfield_for_manytomany(self, db_field, request, **kwargs): if db_field.name == 'tags': kwargs['queryset'] = Tag.objects.filter(active=True) return super().formfield_for_manytomany(db_field, request, **kwargs) admin.site.register(Post, PostAdmin) 
  5. Adding Search Functionality to ManyToManyField in Django Admin

    • Description: Add search capability to ManyToMany fields to enhance usability when displayed as checkboxes.
    • Code:
      from django.contrib import admin from myapp.models import Teacher, Subject class TeacherAdmin(admin.ModelAdmin): filter_horizontal = ('subjects',) search_fields = ['name', 'subjects__name'] # Search through related fields admin.site.register(Teacher, TeacherAdmin) 
  6. Using raw_id_fields Instead of Checkboxes for Large ManyToManyField

    • Description: When dealing with large ManyToMany relationships, raw_id_fields can be used to avoid too many checkboxes.
    • Code:
      from django.contrib import admin from myapp.models import Student, Course class StudentAdmin(admin.ModelAdmin): raw_id_fields = ('courses',) # Use raw ID fields instead of checkboxes admin.site.register(Student, StudentAdmin) 
  7. Customizing ManyToManyField Display in Django Admin

    • Description: Use a custom form or widget to change how a ManyToManyField is displayed in Django admin.
    • Code:
      from django import forms from django.contrib import admin from myapp.models import Genre, Album class CustomCheckboxSelectMultiple(forms.CheckboxSelectMultiple): pass # Implement custom behavior if needed class AlbumAdminForm(forms.ModelForm): class Meta: model = Album fields = '__all__' widgets = { 'genres': CustomCheckboxSelectMultiple(), # Custom checkbox display } class AlbumAdmin(admin.ModelAdmin): form = AlbumAdminForm # Use custom form for admin admin.site.register(Album, AlbumAdmin) 
  8. Restricting Access to ManyToManyField in Django Admin

    • Description: Restrict who can modify ManyToMany relationships based on user permissions or roles.
    • Code:
      from django.contrib import admin from myapp.models import Employee, Project class ProjectAdmin(admin.ModelAdmin): filter_horizontal = ('employees',) def get_form(self, request, obj=None, **kwargs): form = super().get_form(request, obj, **kwargs) if not request.user.is_superuser: form.base_fields['employees'].disabled = True # Restrict modification return form admin.site.register(Project, ProjectAdmin) 
  9. Adding Inline Forms for ManyToManyField in Django Admin

    • Description: Use inline forms to show related objects in Django admin, allowing checkboxes or other UI elements.
    • Code:
      from django.contrib import admin from myapp.models import Order, Product class ProductInline(admin.TabularInline): model = Order.products.through # Intermediate model for ManyToMany extra = 1 # Number of empty forms to show class OrderAdmin(admin.ModelAdmin): inlines = [ProductInline] # Display related products inline admin.site.register(Order, OrderAdmin) 
  10. Using autocomplete_fields for ManyToManyField in Django Admin


More Tags

higher-order-components visual-studio parameter-passing appium unmount imshow mobile-application html-lists dummy-variable testbed

More Python Questions

More Everyday Utility Calculators

More Tax and Salary Calculators

More Livestock Calculators

More Biochemistry Calculators