我关注基本概念的tutorial。如何在django中自定义用户。 我不想使用内置的auth用户。我发现这个教程似乎一直有效。
我完成整个教程,一切正常。然而,当我运行我的项目时,登录并在管理区域中打开用户我单击“保存并继续编辑”这给了我错误
我项目中的代码与教程中的代码完全相同。我已经尝试删除我的缓存和迁移并重新开始,甚至创建一个新环境并重新安装django。似乎没什么用。
Environment:
Request Method: POST
Request URL: http://localhost:8000/admin/accounts/user/1/change/
Django Version: 2.0.1
Python Version: 3.5.2
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'accounts']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/db/backends/base/base.py" in _commit
239. return self.connection.commit()
The above exception (FOREIGN KEY constraint failed) was the direct cause of the following exception:
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/core/handlers/exception.py" in inner
35. response = get_response(request)
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
128. response = self.process_exception_by_middleware(e, request)
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/core/handlers/base.py" in _get_response
126. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/contrib/admin/options.py" in wrapper
574. return self.admin_site.admin_view(view)(*args, **kwargs)
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/utils/decorators.py" in _wrapped_view
142. response = view_func(request, *args, **kwargs)
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
44. response = view_func(request, *args, **kwargs)
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/contrib/admin/sites.py" in inner
223. return view(request, *args, **kwargs)
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/contrib/admin/options.py" in change_view
1556. return self.changeform_view(request, object_id, form_url, extra_context)
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/utils/decorators.py" in _wrapper
62. return bound_func(*args, **kwargs)
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/utils/decorators.py" in _wrapped_view
142. response = view_func(request, *args, **kwargs)
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/utils/decorators.py" in bound_func
58. return func.__get__(self, type(self))(*args2, **kwargs2)
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/contrib/admin/options.py" in changeform_view
1450. return self._changeform_view(request, object_id, form_url, extra_context)
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/db/transaction.py" in __exit__
212. connection.commit()
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/db/backends/base/base.py" in commit
261. self._commit()
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/db/backends/base/base.py" in _commit
239. return self.connection.commit()
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/db/utils.py" in __exit__
89. raise dj_exc_value.with_traceback(traceback) from exc_value
File "/home/tate/virtenvs/tukaha-website/lib/python3.5/site-packages/django/db/backends/base/base.py" in _commit
239. return self.connection.commit()
Exception Type: IntegrityError at /admin/accounts/user/1/change/
Exception Value: FOREIGN KEY constraint failed
我不确定这里发生的事情与我的django版本有什么关系?我正在使用2.0。
我在stackoverflow上看了类似this的类似示例但是我没有在教程中使用外键,我甚至不知道从他们的示例中导入User对象的位置...是有什么我错过了或教程错过了什么,我只是在版本问题上摔倒?
要重现错误,请严格按照文本教程here进行操作:然后使用您的超级用户帐户登录。编辑用户并单击“保存”并继续编辑。
感谢任何帮助
答案 0 :(得分:0)
我想我找到了解决方案。当您将默认AUTH_USER_MODEL迁移到项目中间的自定义模型时,问题很可能是由循环依赖性问题引起的。
来自Django文档
在创建数据库表之后更改AUTH_USER_MODEL要困难得多,因为它会影响外键和多对多关系,例如。
此更改无法自动完成,需要手动修复架构,从旧用户表移动数据,并可能手动重新应用某些迁移。有关步骤的概述,请参阅#25313。
由于Django对可交换模型的动态依赖特性的限制,AUTH_USER_MODEL引用的模型必须在其app的第一次迁移中创建(通常称为0001_initial);否则,你会有依赖性问题。
此外,在运行迁移时可能会遇到CircularDependencyError,因为Django由于动态依赖性而无法自动中断依赖循环。如果您看到此错误,则应通过将用户模型所依赖的模型移动到第二次迁移中来中断循环。 (你可以尝试制作两个相互具有ForeignKey的普通模型,看看makemigrations如何解决循环依赖关系,如果你想看看它是如何完成的。)
解决此问题的最佳方法是删除表并删除所有迁移文件,然后使用新制作的自定义模型重新运行迁移。希望这会奏效。
有关如何从内置模型迁移到新模型的更多详细信息,请参见此处 https://code.djangoproject.com/ticket/25313