首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对自定义用户模型使用Django auth UserAdmin

对自定义用户模型使用Django auth UserAdmin
EN

Stack Overflow用户
提问于 2013-02-22 05:06:40
回答 5查看 60.3K关注 0票数 87

Django.Contrib.Auth docs

扩展了Django的默认用户如果你对Django的用户模型非常满意,并且你只想添加一些额外的配置文件信息,你可以简单地继承django.contrib.auth.models.AbstractUser并添加你的自定义配置文件字段。该类以抽象模型的形式提供了默认用户的完整实现。

言归正传。我创建了如下所示的新模型:

代码语言:javascript
复制
class MyUser(AbstractUser):
  some_extra_data = models.CharField(max_length=100, blank=True)

这几乎和Django的标准User一样出现在管理中。然而,admin中最重要的区别是密码(重新)设置字段不存在,而是显示一个普通的CharField。我真的必须覆盖admin-config中的内容才能让它工作吗?如果是这样的话,我如何才能以一种比较枯燥的方式做到这一点(例如,不复制Django源代码中的东西……恶...)?

EN

回答 5

Stack Overflow用户

发布于 2013-02-22 06:55:34

在深入研究了Django源代码一段时间后,我找到了一个有效的解决方案。我对这个解决方案并不完全满意,但它似乎是有效的。请随时提出更好的解决方案!

Django使用UserAdminUser模型渲染漂亮的管理员外观。只需在我们的admin.py-file中使用它,我们就可以获得与我们的模型相同的外观。

代码语言:javascript
复制
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来将我的特殊字段添加到字段集中,这是这个解决方案中我有点不喜欢的部分,因为它看起来有点丑陋。请随时提出改进建议!

代码语言:javascript
复制
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)
票数 142
EN

Stack Overflow用户

发布于 2013-07-06 05:04:51

nico的回答非常有帮助,但我发现Django在创建新用户时仍然引用用户模型。

Ticket #19353引用了这个问题。

为了修复它,我不得不对admin.py做了更多的添加

admin.py:

代码语言:javascript
复制
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)
票数 57
EN

Stack Overflow用户

发布于 2014-04-14 23:08:28

更简单的解决方案,admin.py:

代码语言:javascript
复制
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。

票数 57
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15012235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档