Django | formfield_for_manytomany - name display in admin

Viewed 392

I am just learning Django, please forgive any ignorance here.

Here's my models.py:

from django.db import models
from django.contrib.auth.models import User


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    admin = models.BooleanField("Admin Status")


class Team(models.Model):
    name = models.CharField("Team Name", max_length=20, default="")
    admins = models.ManyToManyField(User, related_name="admins")
    members = models.ManyToManyField(User, related_name="members")

Here's my admin.py

from django.contrib import admin
from .models import Team, Profile
from django.contrib.auth.models import User


class ProfileAdmin(admin.ModelAdmin):
    list_display = ('user', 'admin')


admin.site.register(Profile, ProfileAdmin)


class TeamAdmin(admin.ModelAdmin):
    list_display = ('name',)

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        print(db_field)
        if db_field.name == "admins":
            kwargs["queryset"] = Profile.objects.filter(admin=True)
        return super(TeamAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)


admin.site.register(Team, TeamAdmin)

This works perfect, but the admins on my admin page are showing as "Profile object (1)," "Profile object (2)," etc...

What am I doing wrong? Or where do I change the way those display?

1 Answers

It takes the __str__ as names for the object, and by default that uses Model object (pk). You thus can override the __str__, for example with:

class Profile(models.Model):
    # …

    def __str__(self):
        return str(user)
Related