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
否则我会得到一个包含字段 username
、password
的表单(这不是密码类型,因为其中写入的任何内容都是明文)然后我得到 first name
和 last 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
此方法非常成功,希望对其他人有所帮助。
我有两个不同的字段集,具体取决于用户是否在 '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
否则我会得到一个包含字段 username
、password
的表单(这不是密码类型,因为其中写入的任何内容都是明文)然后我得到 first name
和 last 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
此方法非常成功,希望对其他人有所帮助。