Is this a bug OR How can I use a custom widget in the Admin for a custom user

8 views
Skip to first unread message

Mike Dewhirst

unread,
Jan 6, 2020, 12:32:58 AM1/6/20
to Django users
It appears that formfield_for_manytomany() triggers an error if it is
used in UserAdmin.

Thanks for any support in deciding if this is a bug - or perhaps all my
own work.

Cheers

Mike

TL;DR

Here is all the admin code which works without error if
formfield_for_manytomany()is commented out ...

from django.contrib import admin
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from django.db import models
from common.models import UserProfile
from common.utils import (
    is_sharedsds, user_sharedsds_admin, userprofile_sharedsds_admin,
)
from common.widgets import CommonFilteredSelectMultiple

class CommonUserAdmin(UserAdmin):

    def formfield_for_manytomany(self, db_field, request, **kwargs):
        pass

        #if db_field.name == "groups":
        #    formfield_overrides = {
        #        models.ManyToManyField: {'widget':
CommonFilteredSelectMultiple},
        #    }

    model = get_user_model()
    extra = 0
    readonly_fields = [
        "last_login",
        "is_staff",
        "is_active",
        "date_joined",
        "groups",
    ]
    # user_sharedsds_admin() makes some of the above r/o fields r/w
only for sharedsds members
    get_readonly_fields = user_sharedsds_admin
    fieldsets = [
        (
            "More detail",
            {
                "description": "Server date/times are UTC rather than
local time<hr/>",
                "classes": ("collapse",),
                "fields": (
                    "password",
                    "last_login",
                    "username",
                    "first_name",
                    "last_name",
                    "email",
                    "is_staff",
                    "is_active",
"groups",
                    "date_joined",
                ),
            },
        ),
    ]

    class UserProfileInline(admin.StackedInline):
        def has_add_permission(self, request=None, obj=None):
            return False

        def has_delete_permission(self, request=None, obj=None):
            return False

        model = UserProfile
        extra = 0
        verbose_name_plural = "Profile"
        readonly_fields = ("company", "modified",)
        # userprofile_sharedsds_admin() makes some of the above r/o
fields r/w for sharedsds members
        get_readonly_fields = userprofile_sharedsds_admin
        fieldsets = (
            (
                "Cellphone, Company",
                {
                    "classes": ("collapse",),
                    "fields": ("cellphone", "company",),
                },
            ),
            (
                "Preferences",
                {
                    "classes": ("collapse",),
                    "fields": (
                        "code_preference",
                        "subsections",
                        "licensed_data",
                        "open_data",
                        "ingredient_data",
                        "modified",
                    ),
                },
            ),
        )
    inlines = [
        UserProfileInline,
    ]

admin.site.register(get_user_model(), CommonUserAdmin)


Mike Dewhirst

unread,
Jan 6, 2020, 1:40:13 AM1/6/20
to django...@googlegroups.com
On 6/01/2020 4:31 pm, Mike Dewhirst wrote:
> It appears that formfield_for_manytomany() triggers an error if it is
> used in UserAdmin.
>
> Thanks for any support in deciding if this is a bug - or perhaps all
> my own work.

I needed to finish formfield_for_manytomany() with a return
super().formfield_for_manytomany

Thank you Stephen

Mike
Reply all
Reply to author
Forward
0 new messages