Admin Django fieldset创建新用户创建表单

时间:2018-06-17 00:40:34

标签: django django-admin django-users

我有两个不同的字段集,具体取决于用户是否处于'领导'组中。该字段集准确显示了我想要的内容,除非我尝试从“Leader”组中的用户添加新用户,我现在获得了不同的用户创建表单。 我从here获得了如何处理不同的字段集,并尝试通过覆盖自定义表单here来确保表单确实是正确的。

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 name和{ {1}}。 User Creation Form if user is in Leader Group

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

1 个答案:

答案 0 :(得分:0)

在此特定情况下起作用的一个小技巧是,URL的末尾总是带有“ ADD”。 因此,通过检查它是否是页面上当前的用户添加表单,函数可以返回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

这项工作取得了巨大的成功,希望对其他人有所帮助。