我正在尝试在Django中设置自定义用户模型。原因是我想使用电子邮件作为用户名,并完全删除用户名字段。我遇到了一个错误,我无法解决。
Manager isn't available; User has been swapped for 'app.MyUser'
Exception Location: .../django/db/models/manager.py in __get__, line 256
Python Version: 2.7.3
Python Path:
[...project specific files,
'/usr/lib/python2.7',
'/usr/lib/python2.7/plat-linux2',
'/usr/lib/python2.7/lib-tk',
'/usr/lib/python2.7/lib-old',
'/usr/lib/python2.7/lib-dynload',
'/usr/local/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages',
'/usr/lib/python2.7/dist-packages/PIL',
'/usr/lib/python2.7/dist-packages/gtk-2.0',
'/usr/lib/pymodules/python2.7',
'/usr/lib/python2.7/dist-packages/wx-2.8-gtk2-unicode']
我已经疯狂地搜索了谷歌,但并没有找到太多关于这个错误信息的页面。我发现了一些页面,提供了解决方案的建议,但是这些建议都没有对我起作用。
我的代码:我已经设置了自定义用户模型。我在settings.py中声明了自定义用户模型
AUTH_USER_MODEL = 'app.MyUser'
。我还设置了一个自定义的UserManager:class MyUserManager(BaseUserManager):
def create_user(self, email, password=None):
"""
Creates and saves a User with the given email. Note that none of the optional fields gets values in the creation. These fields will have to be filled out later on.
"""
if not email:
raise ValueError('Users must have an email address')
user = self.model(email=MyUserManager.normalize_email(email))
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password=None):
"""
Creates and saves a superuser with the the above mentioned attributes
"""
user = self.create_user(email, password=password)
user.is_admin = True
user.save(using=self._db)
return user
class MyUser(AbstractBaseUser, PermissionsMixin):
"""
Custom made User model. No username, instead email is used as unique field and index
"""
Genders = (('M', 'Man'), ('K', 'Woman'))
FirstName = models.CharField(max_length=30)
LastName = models.CharField(max_length=40)
Gender = models.CharField(max_length=2, choices=Genders, default='K')
email = models.EmailField(verbose_name='email address', max_length=255, unique=True, db_index=True,)
twitter = models.CharField(max_length=30)
is_admin = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
def get_full_name(self):
# The user is identified by their email address
return self.email
def get_short_name(self):
# The user is identified by their email address
return self.email
def __unicode__(self):
return self.email
objects = MyUserManager()
我尝试过声明不同类型的UserAdmins,但没有任何效果。我尝试的第一个是:
class MyUserAdmin(UserAdmin):
# The forms to add and change user instances
#form = UserChangeForm
#add_form = FrontpageRegistrationForm
list_display = ('email', 'FirstName', 'LastName', 'Gender', 'twitter')
list_filter = ()
add_fieldsets = ((None, {'classes': ('wide',),'fields': ('email', 'password1', 'password2')}),)
search_fields = ('email',)
ordering = ('email',)
filter_horizontal = ()
admin.site.register(MyUser, MyUserAdmin)
我已经将add_form
和form
这两个属性注释掉,因为它们引发了一些表单错误,我想稍后再解决。
读到这里可能有一种解决方法后,第二个UserAdmin被创建。然而,这并没有帮助到当前的情况;
class MyUserAdmin(admin.ModelAdmin):
# The forms to add and change user instances
#form = UserChangeForm
add_form = FrontpageRegistrationForm
add_fieldsets = ((None, {'classes': ('wide',),'fields': ('email', 'password1', 'password2')}),)
def get_fieldsets(self, request, obj=None):
if not obj:
return self.add_fieldsets
return super(MyUserAdmin, self).get_fieldsets(request, obj)
def get_form(self, request, obj=None, **kwargs):
defaults = {}
if obj is None:
defaults.update({'form': self.add_form,'fields': admin.util.flatten_fieldsets(self.add_fieldsets),})
defaults.update(kwargs)
return super(MyUserAdmin, self).get_form(request, obj, **defaults)
我尝试删除数据库中的所有表,但没有成功。
我会永远感激任何人甚至看一眼这个问题。如果有人解决了这个问题,我会尽力说服我的妻子以第一个给我提供解决方案的Avatar的名字来命名我们的第一个孩子,这样我就可以继续过我的生活。
编辑:我尝试将AUTH_USER_MODEL
设置为mainfolder.app.MyUser
,我确信"mainfolder"在pythonpath上。init.py应该是正确的。新的settings.py给出了以下服务器错误:auth.user: AUTH_USER_MODEL不符合'app_label.app_name'的格式。admin.logentry: 'user'与模型smartflightsearch.SFSdb.MyUser有关联,该模型未被安装或为抽象模型。registration.registrationprofile: 'user'与模型有关联,该模型未被安装或为抽象模型。
这是一个我不知道如何解释的新线索。
'app'
吗? - RohanFrontpageRegistrationForm
在Meta
中有model = get_user_model()
后,您是否仍然遇到错误? - Ivan Kharlamov