代码之家  ›  专栏  ›  技术社区  ›  Felix

ADMIN Django字段集创建新用户创建窗体

  •  0
  • Felix  · 技术社区  · 8 年前

    我有两个不同的字段集,这取决于用户是否属于“leader”组。字段集准确地显示了我想要的内容,但是当我试图从“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

    否则我会得到一张有字段的表格, username , password (这不是密码类型,因为里面写的都是明文)然后我得到 first name last name . User Creation Form if user is in Leader Group

    有人能给我解释一下为什么会这样,我能做些什么来解决它吗?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Felix    7 年前

    在这个特殊的情况下,一个小技巧是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
    

    这项工作非常成功,我希望它能帮助其他人。

    推荐文章