覆盖第三方应用程序social-auth-app-django使用的create_user函数

问题描述

您好,我有一个项目,在其中创建了从BaseUserManager继承的自己的用户模型。

class MyAccountManager(BaseUserManager):
    def create_user(self,email,first_name,last_name,password=None):
        if not email:
            raise ValueError('Este es un campo requerido')
        if not first_name:
            raise ValueError('Este es un campo requerido')
        if not last_name:
            raise ValueError('Este es un campo requerido')

        user = self.model(
            email=self.normalize_email(email),first_name=first_name,last_name=last_name,)

        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self,password):
        user = self.create_user(
            email=self.normalize_email(email),password=password,)
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user``

现在,我还想为用户添加通过Facebook登录的选项,但这给了我一个例外,说create_user()缺少2个必需的位置参数:“ first_name”和“ last_name”,因为我修改了模型以请求这些字段,而不是用户名和其他更改。我该如何做才能使其与我的自定义用户模型一起正常工作?

这是完整的追溯:

Traceback:

File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\django\core\handlers\exception.py" in inner
      34.             response = get_response(request)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\django\core\handlers\base.py" in _get_response
      115.                 response = self.process_exception_by_middleware(e,request)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\django\core\handlers\base.py" in _get_response
      113.                 response = wrapped_callback(request,*callback_args,**callback_kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func
      44.         response = view_func(request,*args,**kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view
      54.         return view_func(*args,**kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_django\utils.py" in wrapper
      49.             return func(request,backend,**kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_django\views.py" in complete
      31.     return do_complete(request.backend,_do_login,user=request.user,File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\actions.py" in do_complete
      45.         user = backend.complete(user=user,**kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\backends\base.py" in complete
      40.         return self.auth_complete(*args,**kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\utils.py" in wrapper
      251.             return func(*args,**kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\backends\facebook.py" in auth_complete
      111.         return self.do_auth(access_token,response,**kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\backends\facebook.py" in do_auth
      153.         return self.strategy.authenticate(*args,**kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_django\strategy.py" in authenticate
      107.         return authenticate(*args,**kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\django\contrib\auth\__init__.py" in authenticate
      73.             user = backend.authenticate(request,**credentials)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\backends\base.py" in authenticate
      80.         return self.pipeline(pipeline,**kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\backends\base.py" in pipeline
      83.         out = self.run_pipeline(pipeline,pipeline_index,**kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\backends\base.py" in run_pipeline
      113.             result = func(*args,**out) or {}
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\pipeline\user.py" in create_user
      75.         'user': strategy.create_user(**fields)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_core\strategy.py" in create_user
      53.         return self.storage.user.create_user(*args,**kwargs)
    
    File "C:\Users\Roberto\Desktop\radlab\dev\radlab_site\lib\site-packages\social_django\storage.py" in create_user
      80.                     user = cls.user_model().objects.create_user(*args,**kwargs)
    
    Exception Type: TypeError at /oauth/complete/facebook/
    Exception Value: create_user() missing 2 required positional arguments: 'first_name' and 'last_name'

解决方法

我在读取了库中的一堆文件后才发现它,原来您只需要向您的USER_FIELDS = ['field1','field2',...,'fieldn']文件中添加以下代码行settings.py即可告诉应用程序您已经修改了create_user()函数以使用USER_FIELDS中的字段。