虽然为时已晚,但以防万一。
您需要通过继承DefaultAccountAdapter并将其设置为子类来创建自己的Custom 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
将看起来像这样
类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
...