#847 closed defect (invalid)
users.create_user fails if User is subclassed using replaces_module = 'auth.users'
| Reported by: | EABinGA | Owned by: | Adrian Holovaty |
|---|---|---|---|
| Component: | Metasystem | Version: | |
| Severity: | normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
Given the following model:
class User(auth.User):
class META:
admin = meta.Admin()
replaces_module = 'auth.users'
foo = meta.URLField(blank=True)
¨django-admin.py sql auth¨ creates the correct output
CREATE TABLE "auth_users" (
"id" integer NOT NULL PRIMARY KEY,
"date_joined" datetime NOT NULL,
"last_login" datetime NOT NULL,
"is_superuser" bool NOT NULL,
"is_active" bool NOT NULL,
"is_staff" bool NOT NULL,
"password_md5" varchar(32) NOT NULL,
"email" varchar(75) NOT NULL,
"last_name" varchar(30) NOT NULL,
"first_name" varchar(30) NOT NULL,
"username" varchar(30) NOT NULL UNIQUE,
"foo" varchar(200) NOT NULL
);
But an attempt to create a superuser with django-admin fails.
A debugging session yields the following:
eric@home[bbs]|1> %pdb
Automatic pdb calling has been turned ON
eric@home[bbs]|2> from django.models.auth import users
eric@home[bbs]|3> users.create_user("foo", "bar@baz.com", "secret")
---------------------------------------------------------------------------
exceptions.AttributeError Traceback (most recent call last)
/home/eric/django/bbs/<console>
/usr/lib/python2.4/site-packages/django-1.0.0-py2.4.egg/django/models/auth.py in _module_create_user(username, email, password)
181 now = datetime.datetime.now()
182 user = User(None, username, '', '', email.strip().lower(), password_md5, False, True, False, now, now)
--> 183 user.save()
184 return user
185
/usr/lib/python2.4/site-packages/django-1.0.0-py2.4.egg/django/utils/functional.py in _curried(*moreargs, **morekwargs)
2 def _curried(*moreargs, **morekwargs):
----> 3 return args[0](*(args[1:]+moreargs), **dict(kwargs.items() + morekwargs.items()))
4 return _curried
5
6 def lazy(func, *resultclasses):
/usr/lib/python2.4/site-packages/django-1.0.0-py2.4.egg/django/core/meta/__init__.py in method_save(opts, self)
941 field_names = [db.db.quote_name(f.column) for f in opts.fields if not isinstance(f, AutoField)]
942 placeholders = ['%s'] * len(field_names)
--> 943 db_values = [f.get_db_prep_save(f.pre_save(getattr(self, f.attname), True)) for f in opts.fields if not isinstance(f, AutoField)]
944 if opts.order_with_respect_to:
945 field_names.append(db.db.quote_name('_order'))
AttributeError: 'User' object has no attribute 'foo'
> /usr/lib/python2.4/site-packages/django-1.0.0-py2.4.egg/django/core/meta/__init__.py(943)method_save()
-> db_values = [f.get_db_prep_save(f.pre_save(getattr(self, f.attname), True)) for f in opts.fields if not isinstance(f, AutoField)]
(Pdb) field_names
['"date_joined"', '"last_login"', '"is_superuser"', '"is_active"', '"is_staff"', '"password_md5"', '"email"', '"last_name"', '"first_name"', '"username"', '"foo"']
(Pdb) self.__class__
<class 'django.models.board.User'>
(Pdb) dir(self) # WHERE IS FOO??
['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', '__getattribute__', '__hash__', '__init__', '__metaclass__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_meta', 'add_message', 'check_password', 'date_joined', 'delete', 'email', 'email_user', 'first_name', 'get_absolute_url', 'get_all_permissions', 'get_and_delete_messages', 'get_board_post', 'get_board_post_count', 'get_board_post_list', 'get_board_topic', 'get_board_topic_count', 'get_board_topic_list', 'get_full_name', 'get_group_list', 'get_group_permissions', 'get_message', 'get_message_count', 'get_message_list', 'get_next_by_date_joined', 'get_next_by_last_login', 'get_permission_list', 'get_previous_by_date_joined', 'get_previous_by_last_login', 'get_profile', 'has_module_perms', 'has_perm', 'has_perms', 'id', 'is_active', 'is_anonymous', 'is_staff', 'is_superuser', 'last_login', 'last_name', 'password_md5', 'save', 'set_groups', 'set_password', 'set_user_permissions', 'username']
(Pdb) getattr(self, f.attname)
*** AttributeError: 'User' object has no attribute 'foo'
Change History (2)
comment:1 by , 20 years ago
| Resolution: | → invalid |
|---|---|
| Status: | new → closed |
comment:2 by , 20 years ago
The question that I still have though, is why does self (an instance of my custom user class) in method_save not have an attribute ¨foo¨?
I can see the need to provide my own create_user in some cases, but the ¨foo¨ field in this case is set to blank=true and I would expect it to be filled with an apropriate ¨blank¨ value.
I havent grokked much of the meta framework yet and this (hopefully) will become moot, once I can create a working OneToOne relationship with User. (Which btw. doesnt seem to work properly either)
I will take your word and leave this ticket as closed until I know better ;)
If you do
replaces_module = 'auth.users', you're responsible for overriding thecreate_usermodule-level function on your own.