Django管理界面表单用于创建扩展AbstractUser模型

5
我有一个自定义的用户模型,它继承了AbstractUser。我也希望在管理员创建表单中显示这个自定义模型,但是我只能看到用户名和密码字段,其他字段都没有显示出来。
有趣的是,我在admin.py文件中对这三个字段进行更改时,只有密码字段的帮助文本或标签发生了变化,其他字段仍然没有显示出来。
此外,如果我设置extend UserAdmin并注册它,则会得到一个通用用户的三个字段创建视图,但如果我扩展ModelAdmin,则会得到所有字段,但无法使用密码更新表单,它会显示404错误。
需要注意的是,对象列表中的链接是“用户”,而不是我的模型名“CommonUser”,这可能是由于类元数据导致的。
admin.py代码:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.forms import UserChangeForm, UserCreationForm
from models import CommonUser, Account, Registry
from django import forms


class MyUserChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = CommonUser


class MyUserCreationForm(UserCreationForm):

 password = forms.CharField(
    label='Password',
    max_length = 32,
    required=True,
    widget=forms.PasswordInput,
    )

password2 = forms.CharField(
    label='Confirm',
    max_length = 32,
    required=True,
    widget=forms.PasswordInput,
    help_text="Make sure they match!",
    )


class Meta(UserCreationForm.Meta):
    model = CommonUser
    fields = ['username', 'password', 'password2', 'email',
        'first_name','last_name','address','city','state','zipcode',
        'phone1','phone2',]
    help_texts = {
        'password': 'Must be at least 8 characters.',
    }


def clean_username(self):
    username = self.cleaned_data['username']
    try:
        CommonUser.objects.get(username=username)
    except CommonUser.DoesNotExist:
        return username
    raise forms.ValidationError(self.error_messages['duplicate_username'])


class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm
    add_form = MyUserCreationForm
    fieldsets = UserAdmin.fieldsets + (
        ('Personal info', {'fields': ('address', 'phone1',)}),
    )

admin.site.register(CommonUser, MyUserAdmin)

(模型文件的片段) model.py

from django.contrib.auth.models import AbstractUser

class CommonUser(AbstractUser):
    "User abstraction for carrying general info."

    WORK_STATES = (
            ('FL', 'FL'),
        )

    address = models.CharField(max_length=50)
    city = models.CharField(max_length=30)
    state = models.CharField(max_length=2, default='FL', choices=WORK_STATES)
    zipcode = models.CharField(max_length=10)
    phone1 = models.CharField(max_length=15)
    phone2 = models.CharField(max_length=15, null=True)
    gets_email_updates = models.BooleanField(default=False)

来源

在Django的管理员界面中扩展新用户表单 为自定义用户模型使用Django auth UserAdmin https://docs.djangoproject.com/en/1.6/topics/auth/customizing/#a-full-example


所以在管理面板中,您想要能够编辑CommonUser模型?您必须在admin.py中注册它:from django.contrib import admin; admin.site.register(CommonUser) - Mihai Zamfir
注册是上面admin.py中的最后一行。此外,changeform运行良好,没有任何问题。只是创建表单似乎不想友好地工作。 - meteorainer
1个回答

16

django.contrib.auth.admin中的UserAdmin还设置了"add_fieldsets"属性,该属性设置在添加用户视图中显示的字段。由于UserAdmin设置了这个字段,您需要覆盖它以设置自己的字段。

以下是一个示例:

class CustomUserAdmin(UserAdmin):
# ...code here...

    fieldsets = (
        (None, {'fields': ('email',)}),
        (_('Personal info'), {'fields': ('first_name', 'last_name')}),
        (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser',
                                       'groups', 'user_permissions')}),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'first_name', 'last_name', 'password1',
                       'password2')}
         ),
    )

希望这可以帮到您!


1
你真是个天才。标记为答案了。有我错过的文档吗?这么简单,竟然有一个单独的字段集,但我在哪里找到它呢? - meteorainer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接