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."
--
You received this message because you are subscribed to the Google Groups "Django
users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to django-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-users/66960ebe-c100-94f1-a515-75641451af99%40dewhirst.com.au.