Search code examples
djangodjango-adminmany-to-many

How can I display my data in the admin from many to many field in django?


I need some help with the many to many in the django admin. My values saved in the team models are not being displayed in my member section. The dropdown list is empty, and in my team model admin, data are only displayed in the filter section but not on the main list. Here are my models:

DEPARTMENT = (

    ('C', 'Children'),
    ('C', 'Choir'),
    ('C', 'Cleaning'),

)
class Team(models.Model):
    name = models.CharField(choices=DEPARTMENT, max_length=10)
    member = models.ManyToManyField('Member', related_name='team')

    class Meta:
        verbose_name = 'Team'

    def __str__(self):
        return self.name


class Member(models.Model):
    surname = models.CharField(max_length=20)
    names = models.CharField(max_length=50)
    gender = models.CharField(choices=GENDER, max_length=1)
    dob = models.DateField()
    contact_number = models.CharField(max_length=14, help_text="+27740000000")
    email = models.EmailField(help_text='your email address')
    address = models.CharField(max_length=50, help_text="you street, number, complex name only")
    suburb = models.CharField(max_length=20, help_text="your suburb")
    area_code = models.IntegerField(help_text="0000")
    province = models.CharField(max_length=1, choices=PROVINCE)
    occupation = models.CharField(max_length=30, help_text="Your daily occupation")
    registered_date = models.DateField(default=timezone.now)

    def __str__(self):
        return self.surname

and in the admin:

class TeamInline(admin.TabularInline):
    model = Team.member.through
    extra = 1


@admin.register(Member)
class MemberAdmin(admin.ModelAdmin):
    list_display = ('surname', 'names', 'email', 'contact_number', 'suburb')
    fieldsets = (
        ('Member personal details', {
            'classes': ('grp-collapse grp-open',),
            'fields': ('surname', 'names', 'gender', 'dob', 'contact_number', 'email',
                       'address', 'suburb', 'area_code', 'province', 'occupation', 'registered_date',
                       ),
    }),
    )
    list_filter = ['surname', 'email', 'suburb']
    inlines = [MaritalInline, TeamInline, MembershipInline,]


@admin.register(Team)
class TeamAdmin(admin.ModelAdmin):
    list_display = ('name',)
    fieldsets = (
        ('Team details', {
            'fields': ('name',),
    }),
    )
    list_filter = ['name', ]
    inlines = [TeamInline, ]

and here are my screenshot:


Solution

  • Inlines are for related relationships, not many-to-many. You must use a form field. Default is <select multiple> which is not very appealing, but you can make it sexier with select2 for instance (see also django-autocomplete-light to ease select2 integration with Django) or create a custom field or widget.