我正在基于AbstractUser创建一个自定义用户模型,其中添加了几个额外的字段。我已经阅读了文档和各种示例,但遇到了几个令人沮丧的(也许很简单)的问题
我正在向用户和管理员添加一些额外的字段,以便以后进行组验证。我正在尝试将自定义字段添加到Custom UserCreationForm和UserChangeForm,并且我正在使用Class Meta:尝试添加新字段,同时使用该表单添加现有字段 类CustomUserCreationForm(UserCreationForm):
class Meta(UserCreationForm):
model = CustomUser
fields = UserCreationForm.Meta.fields + ('character_name' ,'ritual_points', 'contribute_points',)
CustomUserChangeForm(UserChangeForm)类:
class Meta(UserChangeForm):
model = CustomUser
fields = UserChangeForm.Meta.fields + ('character_name', 'ritual_points', 'contribute_points',)
根据我所看到的所有示例,它们应该可以正常工作。但是,每次我尝试进行迁移时,都会引发麻烦
TypeError:无法将“ tuple”对象隐式转换为str
我读过的所有内容都表明这应该可以正常工作。
编辑,该图变厚。我应用了一个较早的答案,将()更改为列表[],将他的字段转换为列表,然后又返回了另一个答案:
TypeError:无法将“列表”对象隐式转换为str
有趣的是,对于CustomUserCreationForm来说,它没有任何问题(如果我尝试将()更改为[],则会产生不同的错误,但是CustomUserChangeForm会引发错误。
答案 0 :(得分:2)
只需将字段转换为列表而不是元组。这样可以解决您的问题。
fields = UserChangeForm.Meta.fields + ['character_name','ritual_points','contribute_points',]
答案 1 :(得分:0)
问题是UserChangeForm.Meta.fields
保留值为'__all__'
,而UserCreationForm.Meta.fields
实际上是一个元组。
>>> from django.contrib.auth.forms import UserCreationForm, UserChangeForm
>>> UserChangeForm.Meta.fields
'__all__'
>>> UserCreationForm.Meta.fields
('username',)
在文档中提到我们还需要设置fieldsets
和add_fieldsets
的值。请参阅文档this paragraph底部的注释。
通过仅扩展创建表单并设置fieldsets
和add_fieldsets
的值,我解决了您面临的问题,
class CustomUserAdmin(UserAdmin):
add_form = CustomUserCreationForm
model = User
fieldsets = UserAdmin.fieldsets + (
(None, {'fields': ('extra_fields',)}),
)
add_fieldsets = UserAdmin.add_fieldsets + (
(None, {'fields': ('extra_fields',)}),
)
这应该给您您想要的。我的理论是,由于更改表单已经使用了'__all__'
字段,因此我们不需要更改它,只需将字段添加到字段集。