Django 更改用户模型的用户名以使用PhoneNumberField而不是CharField会导致错误
我从事一个从cookiecutter django开始的项目,我将用户模型的用户名更改为使用django phonenumber field包中的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
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"])