Cookiecutter-Django自定义User模型invitation_code字段无法存入数据库
问题描述
我在使用Cookiecutter-Django时遇到问题:已在users.models.User中添加invitation_code字段,代码如下:
class User(AbstractUser): """ Default custom user model for pintable. If adding fields that need to be filled at user signup, check forms.SignupForm and forms.SocialSignupForms accordingly. """ #: First and last name do not cover name patterns around the globe name = CharField(_("Full name"), max_length=255, null=True, blank=True) first_name = None # type: ignore last_name = None # type: ignore invitation_code = CharField( _("Invitation code"), max_length=8, null=True, blank=True )
随后在users.forms.UserSignupForm中添加该字段,代码如下:
class UserSignupForm(SignupForm): """ Form that will be rendered on a user sign up section/screen. Default fields will be added automatically. Check UserSocialSignupForm for accounts created from social. """ invitation_code = CharField( label=_("Invitation code"), widget=TextInput(attrs={"placeholder": _("Invitation code")}), )
但新用户保存到数据库时,invitation_code字段始终为None,请问我遗漏了什么?
解决方案
Cookiecutter-Django的SignupForm不会自动将自定义表单字段的值同步到用户模型,必须重写表单的save方法手动处理:
修改UserSignupForm,添加save方法:
class UserSignupForm(SignupForm): """ Form that will be rendered on a user sign up section/screen. Default fields will be added automatically. Check UserSocialSignupForm for accounts created from social. """ invitation_code = CharField( label=_("Invitation code"), widget=TextInput(attrs={"placeholder": _("Invitation code")}), ) def save(self, request): # 调用父类方法创建用户实例 user = super().save(request) # 将表单清洗后的邀请码赋值给用户 user.invitation_code = self.cleaned_data.get("invitation_code") user.save() return user
额外注意事项:
- 如果邀请码是必填项,给表单的
invitation_code字段添加required=True,防止提交空值 - 确认已执行数据库迁移:运行
python manage.py makemigrations和python manage.py migrate,确保字段已同步到数据库表中
内容的提问来源于stack exchange,提问作者masavini
相关产品推荐
相关产品推荐

