Admin Django 字段集创建新用户创建表单

Admin Django fieldset creating new user creation form

我有两个不同的字段集,具体取决于用户是否在 'leader' 组中。字段集显示了我想要的内容,除了当我尝试从 'Leader' 组中的用户添加新用户时,我现在得到一个不同的用户创建表单。 我从 here, and I tried ensuring the form is indeed the right one by overriding the custom form as done 了解了如何处理不同的字段集。

class UserCreateForm(UserCreationForm):

    class Meta:
        model = User
        fields = ('username', 'password1', 'password2')

class UserProfileInline(admin.StackedInline):
    model = UserProfile
    can_delete = False
    verbose_name_plural = 'UserProfile'
    fk_name = 'scout_username'

class CustomUserAdmin(UserAdmin):
    #ensuring it's the right form
    add_form = UserCreateForm
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'password1', 'password2'),
        }),
    )
    inlines = (UserProfileInline, )

    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')}),
    )

    leader_fieldsets = (
        ((None), {'fields': ('username', 'password')}),
        (('Personal'), {'fields': ('first_name', 'last_name')}),
        )

    #making it so leaders can only view  the fields within leaders_fieldset
    #removing this also removes the problem yet all the fields are shown regardless of the user's group
    def get_fieldsets(self, request, obj=None):
        if request.user.groups.filter(name='Leader').exists():
            return self.leader_fieldsets
        else:
            return super(CustomUserAdmin, self).get_fieldsets(request, obj=obj)

    #adding the userprofile stuff to the user change form
    def get_inline_instances(self, request, obj=None):
        if not obj:
            return list()
        return super(CustomUserAdmin, self).get_inline_instances(request, obj)

admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)

如果用户不在 'Leader' 组中,我将获得原始用户创建表单。 User Creation Form if user is not in Leader Group

否则我会得到一个包含字段 usernamepassword 的表单(这不是密码类型,因为其中写入的任何内容都是明文)然后我得到 first namelast name。 User Creation Form if user is in Leader Group

有人可以向我解释为什么会发生这种情况以及我可以做些什么来解决它吗?

适用于这种特殊情况的一个小技巧遵循这样一个事实,即 url 总是在末尾有 'ADD'。 因此,通过检查它是否是当前页面上的用户添加表单,函数可以 return true 或 false。

def is_add_form(request):
    path_info = request.META.get('PATH_INFO')
    last_path = str(path_info.split('/')[-2])
    if last_path == 'add':
        return True
    else:
        return False

此方法非常成功,希望对其他人有所帮助。