bpe*_*tit 19 django django-admin django-users
我按照dev doc中的描述扩展了django用户模型.我不想保留大部分原始用户模型功能,因此我扩展了AbstractUser类.我在settings.py中定义了:
AUTH_USER_MODEL = 'myapp.CustomUser'
Run Code Online (Sandbox Code Playgroud)
我的用户类:
class CustomUser(AbstractUser):
custom_field = models.ForeignKey('OtherModel')
objects = UserManager()
Run Code Online (Sandbox Code Playgroud)
一切似乎工作正常,但当我尝试由管理网站管理:
admin.site.register(CustomUser, UserAdmin)
Run Code Online (Sandbox Code Playgroud)
我在管理员CustomUser创建页面上获得此错误(在验证密码确认表单后):
AttributeError: Manager isn't available; User has been swapped for 'myapp.CustomUser'
Run Code Online (Sandbox Code Playgroud)
关键是我需要管理站点管理的这个模型,以便拥有与原始用户模型相同的创建过程(使用密码验证的两步过程).
小智 20
您只需要更改表单以添加用户(覆盖clean_username并在get_user_model()上更改用户
完整的工作示例(如果您继承自AbstractUser)
from django.contrib.auth import get_user_model
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
class MyUserChangeForm(UserChangeForm):
class Meta:
model = get_user_model()
class MyUserCreationForm(UserCreationForm):
class Meta:
model = get_user_model()
def clean_username(self):
username = self.cleaned_data["username"]
try:
get_user_model().objects.get(username=username)
except get_user_model().DoesNotExist:
return username
raise forms.ValidationError(self.error_messages['duplicate_username'])
class MyUserAdmin(UserAdmin):
form = MyUserChangeForm
add_form = MyUserCreationForm
fieldsets = (
(None, {'fields': [('username', 'password'),]}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
(_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
'groups', 'user_permissions')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
)
admin.site.register(MyUser, MyUserAdmin)
Run Code Online (Sandbox Code Playgroud)
Ala*_*ars 13
几个小时我一直在努力解决这个错误.对我来说,我需要删除所有引用
from django.contrib.auth.models import User
Run Code Online (Sandbox Code Playgroud)
然后将其替换为:
from myapp.models import MyUser as User
Run Code Online (Sandbox Code Playgroud)
这假设您的自定义用户模型位于名为的应用程序中,myapp
并且您调用了该模型MyUser
.
我正在使用,as User
所以我不必更改我的现有代码引用该User
对象的位置django.contrib.auth.models
.
祝好运!
艾伦
@aviars
归档时间: |
|
查看次数: |
10682 次 |
最近记录: |