我有djangocustom user modelMyUser
和一个额外字段:
# models.py
from django.contrib.auth.models import AbstractUser
class MyUser(AbstractUser):
age = models.PositiveIntegerField(_("age"))
# settings.py
AUTH_USER_MODEL = "web.MyUser"
我还有根据to these instructions自定义的所有身份验证Signup form class:
# forms.py
class SignupForm(forms.Form):
first_name = forms.CharField(max_length=30)
last_name = forms.CharField(max_length=30)
age = forms.IntegerField(max_value=100)
class Meta:
model = MyUser
def save(self, user):
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.age = self.cleaned_data['age']
user.save()
# settings.py
ACCOUNT_SIGNUP_FORM_CLASS = 'web.forms.SignupForm'
提交SignupForm
(属性MyUser.age
的字段被核心呈现)后,我得到以下错误:
IntegrityError at /accounts/signup/
(1048, "Column 'age' cannot be null")
存储自定义用户模型的正确方法是什么?
django allauth:0.12.0;django:1.5.1;Python 2.7.2
虽然有点晚了,但万一能帮上忙。
您需要通过子类化DefaultAccountAdapter并设置
您还需要在“设置”中定义以下内容:
如果在用户注册期间有一个自定义的SignupForm来创建其他模型,并且需要生成一个原子事务,该事务将阻止任何数据保存到数据库,除非所有数据都成功。
django allauth的
DefaultAdapter
保存用户,因此,如果自定义注册表单的save
方法中有错误,则用户仍将被持久化到数据库中。因此,对于任何面临此问题的人,您的
CustomAdpater
将如下所示类UserAccountAdapter(DefaultAccountAdapter):
然后您可以用
@transaction.atomic
装饰您的自定义注册表单我认为您应该在SignupForm的类Meta中定义fields属性,并设置包含age的字段列表,如下所示:
如果不起作用,看看 this
旁注
对于Django 1.5自定义用户模型,最佳实践是使用
get_user_model
函数:也许没有关系,但我觉得值得注意。
相关问题 更多 >
编程相关推荐