【问题标题】:django-rest-auth with allauth customuser TypeError: 'PhoneNumber' object is not subscriptabledjango-rest-auth with allauth customuser TypeError: 'PhoneNumber' object is not subscriptable
【发布时间】:2021-12-16 10:57:01
【问题描述】:

models.py

class CustomUser(AbstractUser):
    username = PhoneNumberField(unique=True)

有效载荷:

{
  "username": "+8801700000000",
  "password1": "demo",
  "password2": "demo",
  "email": "demo@demo.com",
}

回复:

Internal Server Error: /api/rest-auth/registration/
Traceback (most recent call last):
  File "venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "venv\lib\site-packages\django\views\generic\base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "venv\lib\site-packages\django\utils\decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "venv\lib\site-packages\django\views\decorators\debug.py", line 89, in sensitive_post_parameters_wrapper
    return view(request, *args, **kwargs)
  File "venv\lib\site-packages\rest_auth\registration\views.py", line 46, in dispatch
    return super(RegisterView, self).dispatch(*args, **kwargs)
  File "venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
    raise exc
  File "venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "venv\lib\site-packages\rest_framework\generics.py", line 190, in post
    return self.create(request, *args, **kwargs)
  File "venv\lib\site-packages\rest_auth\registration\views.py", line 65, in create
    user = self.perform_create(serializer)
  File "venv\lib\site-packages\rest_auth\registration\views.py", line 73, in perform_create
    user = serializer.save(self.request)
  File "venv\lib\site-packages\rest_auth\registration\serializers.py", line 210, in save
    adapter.save_user(request, user, self)
  File "venv\lib\site-packages\allauth\account\adapter.py", line 242, in save_user
    self.populate_username(request, user)
  File "venv\lib\site-packages\allauth\account\adapter.py", line 209, in populate_username
    user_username(
  File "venv\lib\site-packages\allauth\account\utils.py", line 120, in user_username
    return user_field(user, app_settings.USER_MODEL_USERNAME_FIELD, *args)
  File "venv\lib\site-packages\allauth\account\utils.py", line 110, in user_field
    v = v[0:max_length]
TypeError: 'PhoneNumber' object is not subscriptable

【问题讨论】:

    标签: django django-rest-framework django-allauth django-rest-auth


    【解决方案1】:

    我认为这个问题是因为所有身份验证都尝试通过使用切片来订阅用户名我建议尝试以下操作

    phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
        phone_number = models.CharField(validators=[phone_regex], max_length=17, blank=True) # validators should be a list
    

    这个令牌来自 What's the best way to store Phone number in Django models

    【讨论】:

    • CharField 将解决问题。但是有什么方法可以使用phonenumberfield?只有 rest-auth 会产生问题,但默认的 allauth 注册效果很好
    • 这种情况下,你需要重写allauth中的utils.py
    猜你喜欢
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2020-11-02
    • 1970-01-01
    • 2022-08-13
    相关资源
    最近更新 更多