<p>虽然有点晚了,但万一能帮上忙。</p>
<p>您需要通过子类化DefaultAccountAdapter并设置</p>
<pre><code>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()
</code></pre>
<p>您还需要在“设置”中定义以下内容:</p>
<pre><code>ACCOUNT_ADAPTER = 'api.adapter.UserAccountAdapter'
</code></pre>
<p>如果在用户注册期间有一个自定义的SignupForm来创建其他模型,并且需要生成一个原子事务,该事务将阻止任何数据保存到数据库,除非所有数据都成功。</p>
<p>django allauth的<code>DefaultAdapter</code>保存用户,因此,如果自定义注册表单的<code>save</code>方法中有错误,则用户仍将被持久化到数据库中。</p>
<p>因此,对于任何面临此问题的人,您的<code>CustomAdpater</code>将如下所示</p>
<p>类UserAccountAdapter(DefaultAccountAdapter):</p>
<pre><code> 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
</code></pre>
<p>然后您可以用<code>@transaction.atomic</code>装饰您的自定义注册表单</p>
<pre><code>@transaction.atomic
def save(self, request, user):
user.save() #save the user object first so you can use it for relationships
...
</code></pre>