This error occurs in the Admin for my custom user when I try to
specify a custom widget for permission groups. I haven't included
'groups' in any raw_id_fields, radio_fields or autocomplete_fields.
The groups are correctly displayed in the Admin user page with the
default FilteredSelectMultiple widget.
This is the relevant code in admin.py ... (traceback below)
class CommonUserAdmin(UserAdmin):
model = get_user_model()
def formfield_for_manytomany(self, db_field, request, **kwargs):
if db_field.name == "groups":
formfield_overrides = {
models.ManyToManyField: {'widget':
CommonFilteredSelectMultiple},
}
...
If I omit the formfield_for_manytomany() method and just run
formfield_overrides nakedly nothing happens - presumably because the
admin doesn't consider "groups" is a ManyToManyField at that point.
How do I persuade the Admin to use my widget?
Thanks for any advice
Mike
Environment:
Request Method: GET
Request URL: http://localhost:8000/admin/common/user/59/change/
Django Version: 2.2.9
Python Version: 3.7.4
Installed Applications:
['django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.admin',
'django.contrib.admindocs',
'django.contrib.staticfiles',
'common',
'billing',
'company',
'credit',
'refer',
'regulation',
'substance',
'workplace']
Installed Middleware:
['django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.contrib.admindocs.middleware.XViewMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'pwned_passwords_django.middleware.PwnedPasswordsMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware']
Template error:
In template
D:\Users\mike\envs\xxex3\lib\site-packages\django\contrib\admin\templates\admin\includes\fieldset.html,
error at line 7
Key 'groups' not found in 'UserForm'. Choices are: email,
first_name, is_active, is_staff, last_name, password, username.
1 : <fieldset class="module aligned {{ fieldset.classes }}">
2 : {% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
3 : {% if fieldset.description %}
4 : <div class="description">{{ fieldset.description|safe
}}</div>
5 : {% endif %}
6 : {% for line in fieldset %}
7 : <div class="form-row{% if line.fields|length_is:'1' and
line.errors %} errors{% endif %}{% if not line.has_visible_field %}
hidden{% endif %} {% for field in line %} {% if field.field.name %}
field-{{ field.field.name }}{% endif %}{% endfor %}">
8 : {% if line.fields|length_is:'1' %}{{ line.errors
}}{% endif %}
9 : {% for field in line %}
10 : <div{% if not line.fields|length_is:'1' %}
class="fieldBox{% if field.field.name %} field-{{ field.field.name
}}{% endif %}{% if not field.is_readonly and field.errors %} errors{%
endif %}{% if field.field.is_hidden %} hidden{% endif %}"{% elif
field.is_checkbox %} class="checkbox-row"{% endif %}>
11 : {% if not line.fields|length_is:'1' and
not field.is_readonly %}{{ field.errors }}{% endif %}
12 : {% if field.is_checkbox %}
13 : {{ field.field }}{{ field.label_tag }}
14 : {% else %}
15 : {{ field.label_tag }}
16 : {% if field.is_readonly %}
17 : <div class="readonly">{{
field.contents }}</div>
Traceback:
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\forms\forms.py" in
__getitem__
163. field = self.fields[name]
During handling of the above exception ('groups'), another exception
occurred:
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\core\handlers\exception.py"
in inner
34. response = get_response(request)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\core\handlers\base.py"
in _get_response
145. response =
self.process_exception_by_middleware(e, request)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\core\handlers\base.py"
in _get_response
143. response = response.render()
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\response.py"
in render
106. self.content = self.rendered_content
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\response.py"
in rendered_content
83. content = template.render(context, self._request)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\backends\django.py"
in render
61. return self.template.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render
171. return self._render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in _render
163. return self.nodelist.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render
937. bit = node.render_annotated(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render_annotated
904. return self.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\loader_tags.py"
in render
150. return compiled_parent._render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in _render
163. return self.nodelist.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render
937. bit = node.render_annotated(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render_annotated
904. return self.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\loader_tags.py"
in render
150. return compiled_parent._render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in _render
163. return self.nodelist.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render
937. bit = node.render_annotated(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render_annotated
904. return self.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\loader_tags.py"
in render
62. result = block.nodelist.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render
937. bit = node.render_annotated(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render_annotated
904. return self.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\loader_tags.py"
in render
62. result = block.nodelist.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render
937. bit = node.render_annotated(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render_annotated
904. return self.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\defaulttags.py"
in render
209. nodelist.append(node.render_annotated(context))
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render_annotated
904. return self.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\loader_tags.py"
in render
188. return template.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render
173. return self._render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in _render
163. return self.nodelist.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render
937. bit = node.render_annotated(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render_annotated
904. return self.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\defaulttags.py"
in render
209. nodelist.append(node.render_annotated(context))
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\base.py"
in render_annotated
904. return self.render(context)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\template\defaulttags.py"
in render
165. values = list(values)
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\contrib\admin\helpers.py"
in __iter__
113. yield AdminField(self.form, field, is_first=(i
== 0))
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\contrib\admin\helpers.py"
in __init__
125. self.field = form[field] # A django.forms.BoundField
instance
File
"D:\Users\mike\envs\xxex3\lib\site-packages\django\forms\forms.py" in
__getitem__
169. ', '.join(sorted(f for f in self.fields)),
Exception Type: KeyError at /admin/common/user/59/change/
Exception Value: "Key 'groups' not found in 'UserForm'. Choices are:
email, first_name, is_active, is_staff, last_name, password, username."