Django 更改用户模型的用户名以使用PhoneNumberField而不是CharField会导致错误

Django 更改用户模型的用户名以使用PhoneNumberField而不是CharField会导致错误,django,cookiecutter-django,Django,Cookiecutter Django,我从事一个从cookiecutter django开始的项目,我将用户模型的用户名更改为使用django phonenumber field包中的PhoneNumberField,而不是普通的模型。CharField,当我试图发布manage.py makemigrations时,我遇到了这个错误: Traceback (most recent call last): File "./manage.py", line 30, in <module> execute_fro

我从事一个从cookiecutter django开始的项目,我将用户模型的用户名更改为使用django phonenumber field包中的
PhoneNumberField
,而不是普通的
模型。CharField
,当我试图发布
manage.py makemigrations
时,我遇到了这个错误:

Traceback (most recent call last):
  File "./manage.py", line 30, in <module>
    execute_from_command_line(sys.argv)
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
    utility.execute()
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/site-packages/django/core/management/__init__.py", line 357, in execute
    django.setup()
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/site-packages/django/apps/registry.py", line 122, in populate
    app_config.ready()
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/site-packages/django/contrib/admin/apps.py", line 24, in ready
    self.module.autodiscover()
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/site-packages/django/contrib/admin/__init__.py", line 26, in autodiscover
    autodiscover_modules('admin', register_to=site)
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/site-packages/django/utils/module_loading.py", line 47, in autodiscover_modules
    import_module('%s.%s' % (app_config.name, module_to_search))
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/home/ahsh/Projects/xpay_stuff/communites_dj_backend/community_backend/users/admin.py", line 10, in <module>
    from community_backend.users.forms import UserChangeForm, UserCreationForm
  File "/home/ahsh/Projects/xpay_stuff/communites_dj_backend/community_backend/users/forms.py", line 8, in <module>
    class UserChangeForm(forms.UserChangeForm):
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/site-packages/django/forms/models.py", line 256, in __new__
    apply_limit_choices_to=False,
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/site-packages/django/forms/models.py", line 172, in fields_for_model
    formfield = f.formfield(**kwargs)
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/site-packages/phonenumber_field/modelfields.py", line 106, in formfield
    return super().formfield(**defaults)
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/site-packages/django/db/models/fields/__init__.py", line 1093, in formfield
    return super().formfield(**defaults)
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/site-packages/django/db/models/fields/__init__.py", line 891, in formfield
    return form_class(**defaults)
  File "/home/ahsh/.local/share/virtualenvs/communities_dj_backend/lib/python3.7/site-packages/django/forms/fields.py", line 214, in __init__
    super().__init__(**kwargs)
TypeError: __init__() got an unexpected keyword argument 'region'


我认为第一个错误的解决方案是关于
cookiecutter django
用户的
应用程序
ChangeForm
CreationForm
,username字段使用username的默认字段类,我必须将该类更改为使用
PhoneNumberField
包中的表单字段。 代码如下:

class UserChangeForm(forms.UserChangeForm):
    class Meta(forms.UserChangeForm.Meta):
        model = User
        field_classes = {"username": PhoneNumberField}

class UserCreationForm(forms.UserCreationForm):

    error_message = forms.UserCreationForm.error_messages.update(
        {"duplicate_username": _("This username has already been taken.")})

    class Meta(forms.UserCreationForm.Meta):
        model = User
        field_classes = {"username": PhoneNumberField}

    def clean_username(self):
        username = self.cleaned_data["username"]

        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            return username

        raise ValidationError(self.error_messages["duplicate_username"])
只添加了
field_classes={“username”:PhoneNumberField}

对于第二个错误,我发现当我发布
manage.py migrate
时,
django guardian
创建了一个匿名用户实例,根据
PhoneNumberField
用户名验证,该实例的用户名无效

解决方案是,因为我们不再依赖于django guardian,而只是将其删除

class UserChangeForm(forms.UserChangeForm):
    class Meta(forms.UserChangeForm.Meta):
        model = User
        field_classes = {"username": PhoneNumberField}

class UserCreationForm(forms.UserCreationForm):

    error_message = forms.UserCreationForm.error_messages.update(
        {"duplicate_username": _("This username has already been taken.")})

    class Meta(forms.UserCreationForm.Meta):
        model = User
        field_classes = {"username": PhoneNumberField}

    def clean_username(self):
        username = self.cleaned_data["username"]

        try:
            User.objects.get(username=username)
        except User.DoesNotExist:
            return username

        raise ValidationError(self.error_messages["duplicate_username"])