重写第三方应用程序socialauthappDjango使用的create_user()函数

2024-04-28 19:24:50 发布

您现在位置:Python中文网/ 问答频道 /正文

您好,我有一个项目,我从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, email, first_name, last_name, password):
        user = self.create_user(
            email=self.normalize_email(email),
            password=password,
            first_name=first_name,
            last_name=last_name,
        )
        user.is_admin = True
        user.is_staff = True
        user.is_superuser = True
        user.save(using=self._db)
        return user``

现在,我还想为用户添加通过facebook登录的选项,但这给了我一个例外,即create_user()缺少两个必需的位置参数:“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, *args, **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, *args, **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, *args, **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, *args, **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, *args, **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'

Tags: nameinpydevselflibpackagessite
1条回答
网友
1楼 · 发布于 2024-04-28 19:24:50

在阅读了库中的一堆文件后,我发现您只需将以下代码行USER_FIELDS = ['field1', 'field2', ... , 'fieldn']添加到settings.py文件中,就可以告诉应用程序您已经修改了create_user()函数以获取USER_FIELDS中的字段

相关问题 更多 >