ill*_*nan 6 python django django-models django-allauth
我有一个额外字段的django 自定义用户模型 MyUser:
# models.py
from django.contrib.auth.models import AbstractUser
class MyUser(AbstractUser):
    age = models.PositiveIntegerField(_("age"))
# settings.py
AUTH_USER_MODEL = "web.MyUser"
# 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呈现为corectly),我收到此错误:
/ accounts/signup /的完整性错误
(1048,"列'年龄'不能为空")
存储自定义用户模型的正确方法是什么?
django-allauth:0.12.0; django:1.5.1; Python 2.7.2
虽然它有点晚,但万一它可以帮助某人.
您需要通过继承DefaultAccountAdapter并设置它来创建自己的自定义AccountAdapter
class UserAccountAdapter(DefaultAccountAdapter):
    def save_user(self, request, user, form, commit=True):
        """
        This is called when saving user via allauth registration.
        We override this to set additional data on user object.
        """
        # Do not persist the user yet so we pass commit=False
        # (last argument)
        user = super(UserAccountAdapter, self).save_user(request, user, form, commit=False)
        user.age = form.cleaned_data.get('age')
        user.save()
您还需要在设置中定义以下内容:
ACCOUNT_ADAPTER = 'api.adapter.UserAccountAdapter'
如果您有一个自定义SignupForm在用户注册期间创建其他模型,并且您需要创建一个原子事务来阻止任何数据保存到数据库,除非所有数据都成功,这也很有用.
在DefaultAdapter对Django的allauth节省了用户,所以如果你在有一个错误save您的自定义SignupForm的方法,用户仍然会被保存到数据库.
所以对于任何面临这个问题的人来说,你CustomAdpater会看起来像这样
class UserAccountAdapter(DefaultAccountAdapter):
    def save_user(self, request, user, form, commit=False):
        """
        This is called when saving user via allauth registration.
        We override this to set additional data on user object.
        """
        # Do not persist the user yet so we pass commit=False
        # (last argument)
        user = super(UserAccountAdapter, self).save_user(request, user, form, commit=commit)
        user.age = form.cleaned_data.get('age')
        # user.save() This would be called later in your custom SignupForm
然后你可以用你的自定义SignupForm来装饰 @transaction.atomic
@transaction.atomic
def save(self, request, user):
    user.save() #save the user object first so you can use it for relationships
    ...
| 归档时间: | 
 | 
| 查看次数: | 7544 次 | 
| 最近记录: |