Django后台登录报错:Related Object Does Not Exist问题求助
当你尝试登录http://localhost:8000/admin/,输入正确用户名和密码后却遇到**「Related Object Does Not Exist at /admin/login/」**错误,还附带「User does not exist」的提示,确实让人头疼。结合你提到之前移除了django.contrib.sites应用,以及当前使用的Django 2.0.2 + Python 3.6环境,我来帮你梳理问题原因和解决办法:
一、你的项目配置信息
settings.py核心配置
# Application definition INSTALLED_APPS = [ 'nutrients.apps.NutrientsConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'profile', ] 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', ] ROOT_URLCONF = 'nutrition.urls' CMS_TEMPLATES = ('index.html', 'Left sidebar template') TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(os.path.dirname(__file__), 'templates'),], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'nutrition.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
报错回溯信息
Request Method: POST Request URL: http://127.0.0.1:8000/admin/login/?next=/admin/ Django Version: 2.0.2 Python Version: 3.6.5 Installed Applications: ['nutrients.apps.NutrientsConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'profile'] 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: Request Method: POST Request URL: http://127.0.0.1:8000/admin/login/?next=/admin/ Django Version: 2.0.2 Python Version: 3.6.5 Installed Applications: ['nutrients.apps.NutrientsConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'profile'] 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 "C:\Users\Kanverse\Anaconda3\lib\site-packages\django\core\handlers\exception.py" in inner 35. response = get_response(request) File "C:\Users\Kanverse\Anaconda3\lib\site-packages\django\core\handlers\base.py" in _get_response 128. response = self.process_exception_by_middleware(e, request) File "C:\Users\Kanverse\Anaconda3\lib\site-packages\django\core\handlers\base.py" in _get_response 126. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\Kanverse\Anaconda3\lib\site-packages\django\views\decorators\cache.py" in _wrapped_view_func 44. response = view_func(request, *args, **kwargs) File "C:\Users\Kanverse\Anaconda3\lib\site-packages\django\contrib\admin\sites.py" in login 398. return LoginView.as_view(**defaults)(request) File "C:\Users\Kanverse\Anaconda3\lib\site-packages\django\views\generic\base.py" in view 69. return self.dispatch(request, *args, **kwargs) File "C:\Users\Kanverse\Anaconda3\lib\site-packages\django\utils\decorators.py" in _wrapper 62. return bound_func(*args, **kwargs) File "C:\Users\Kanverse\Anaconda3\lib\site-packages\django\views\decorators\debug.py" in sensitive_post_parameters_wrapper 76. return view(request, *args, **kwargs) File "C:\Users\Kanverse\Anaconda3\lib\site-packages\django\utils\decorators.py" in bound_func 58. return func.__get__(self, type(self))(*args2, **kwargs2) File "C:\Users\Kanverse\Anaconda3\lib\site-packages\django\utils\decorators.py" in _wrapper 62. return bound_func(*args, **kwargs) File "C:\Users\Kanverse\Anaconda3\lib\site-packages\django\utils\decorators.py" in _wrapped_view 142. response = view_func(request, *args, **kwargs) File "C:\Users\Kanverse\Anaconda3\lib\site-packages\django\utils\decorators.py" in bound_func 58. return func.__
二、问题原因与解决方案
原因分析
在Django 2.0.x版本中,django.contrib.admin底层依赖django.contrib.sites的部分功能,尤其是你的项目中还包含profile应用(大概率是自定义的用户扩展模型),移除django.contrib.sites后,登录逻辑会尝试查找关联的Site对象,找不到就会抛出「Related Object Does Not Exist」错误,同时误提示「User does not exist」。
解决步骤
重新添加
django.contrib.sites到INSTALLED_APPS
修改settings.py的INSTALLED_APPS列表,加入:'django.contrib.sites',配置SITE_ID
在settings.py末尾添加固定站点ID:SITE_ID = 1执行数据库迁移
运行命令创建Site相关的数据库表:python manage.py migrate检查自定义Profile模型(可选)
如果你的profile应用中有与Site模型关联的字段,比如:from django.contrib.sites.models import Site class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE) site = models.ForeignKey(Site, on_delete=models.CASCADE)要么确保数据库中存在ID为1的Site记录(迁移后会自动创建),要么根据业务需求移除该关联字段。
重置管理员账号(可选)
如果迁移后仍有问题,可以尝试重新创建管理员账号:python manage.py createsuperuser
完成以上步骤后,再次尝试登录admin后台,应该就能正常访问了。
内容的提问来源于stack exchange,提问作者Patrick Kiringai

