您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用django-allauth保存自定义用户模型

使用django-allauth保存自定义用户模型

虽然为时已晚,但以防万一。

您需要通过继承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
    ...
Go 2022/1/1 18:42:58 有346人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶