扩展了Django的默认用户如果你对Django的用户模型非常满意,并且你只想添加一些额外的配置文件信息,你可以简单地继承
django.contrib.auth.models.AbstractUser
并添加你的自定义配置文件字段。该类以抽象模型的形式提供了默认用户的完整实现。
言归正传。我创建了如下所示的新模型:
class MyUser(AbstractUser):
some_extra_data = models.CharField(max_length=100, blank=True)
这几乎和Django的标准User
一样出现在管理中。然而,admin中最重要的区别是密码(重新)设置字段不存在,而是显示一个普通的CharField。我真的必须覆盖admin-config中的内容才能让它工作吗?如果是这样的话,我如何才能以一种比较枯燥的方式做到这一点(例如,不复制Django源代码中的东西……恶...)?
发布于 2013-02-22 06:55:34
在深入研究了Django源代码一段时间后,我找到了一个有效的解决方案。我对这个解决方案并不完全满意,但它似乎是有效的。请随时提出更好的解决方案!
Django使用UserAdmin
为User
模型渲染漂亮的管理员外观。只需在我们的admin.py
-file中使用它,我们就可以获得与我们的模型相同的外观。
from django.contrib.auth.admin import UserAdmin
admin.site.register(MyUser, UserAdmin)
然而,这可能不是一个好的解决方案,因为Django Admin不会显示您的任何特殊字段。这有两个原因:
UserAdmin
使用UserChangeForm
作为修改对象时使用的表单,而该对象又使用User
作为其定义formsets
-property的User
,该formsets
-property后来被UserChangeForm
使用,其中不包括您的特殊字段。因此,我创建了一个特殊的change-form,它重载了Meta内部类,以便change form使用正确的模型。我还必须重载UserAdmin
来将我的特殊字段添加到字段集中,这是这个解决方案中我有点不喜欢的部分,因为它看起来有点丑陋。请随时提出改进建议!
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserChangeForm
class MyUserChangeForm(UserChangeForm):
class Meta(UserChangeForm.Meta):
model = MyUser
class MyUserAdmin(UserAdmin):
form = MyUserChangeForm
fieldsets = UserAdmin.fieldsets + (
(None, {'fields': ('some_extra_data',)}),
)
admin.site.register(MyUser, MyUserAdmin)
发布于 2013-07-06 05:04:51
nico的回答非常有帮助,但我发现Django在创建新用户时仍然引用用户模型。
Ticket #19353引用了这个问题。
为了修复它,我不得不对admin.py
做了更多的添加
admin.py:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserChangeForm, UserCreationForm
from main.models import MyUser
from django import forms
class MyUserChangeForm(UserChangeForm):
class Meta(UserChangeForm.Meta):
model = MyUser
class MyUserCreationForm(UserCreationForm):
class Meta(UserCreationForm.Meta):
model = MyUser
def clean_username(self):
username = self.cleaned_data['username']
try:
MyUser.objects.get(username=username)
except MyUser.DoesNotExist:
return username
raise forms.ValidationError(self.error_messages['duplicate_username'])
class MyUserAdmin(UserAdmin):
form = MyUserChangeForm
add_form = MyUserCreationForm
fieldsets = UserAdmin.fieldsets + (
(None, {'fields': ('extra_field1', 'extra_field2',)}),
)
admin.site.register(MyUser, MyUserAdmin)
发布于 2014-04-14 23:08:28
更简单的解决方案,admin.py:
from django.contrib.auth.admin import UserAdmin
from main.models import MyUser
class MyUserAdmin(UserAdmin):
model = MyUser
fieldsets = UserAdmin.fieldsets + (
(None, {'fields': ('some_extra_data',)}),
)
admin.site.register(MyUser, MyUserAdmin)
Django将正确引用MyUser模型进行创建和修改。我使用的是Django 1.6.2。
https://stackoverflow.com/questions/15012235
复制相似问题