Django自定义用户模型-表单元组问题

时间:2019-03-19 22:28:04

标签: django django-models

我正在基于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会引发错误。

2 个答案:

答案 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',)

在文档中提到我们还需要设置fieldsetsadd_fieldsets的值。请参阅文档this paragraph底部的注释。

通过仅扩展创建表单并设置fieldsetsadd_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__'字段,因此我们不需要更改它,只需将字段添加到字段集。