Django后台登录报错:'datetime.datetime'对象无split属性
AttributeError: 'datetime.datetime' object has no attribute 'split'问题 Hey,我来帮你搞定这个登录报错的问题。先梳理下你的情况:你用的是Django 2.0.5,数据库引擎是mysql.connector.django,迁移已经完成,但登录Admin时触发了这个奇怪的AttributeError,错误指向datetime对象没有split方法。
问题背景
你的核心报错信息:
AttributeError at /admin/login/ 'datetime.datetime' object has no attribute 'split'
Request Method: POST
Request URL: http://localhost:8000/admin/login/?next=/admin/
Django Version: 2.0.5
已安装的核心依赖列表:
certifi==2018.4.16 Django==2.0.5 mysql-connector-python==8.0.11 mysqlclient==1.3.12 pytz==2018.4
问题根源
这个问题大概率是**mysql-connector-python 8.0.11和Django 2.0.5的兼容性冲突**。新版本的MySQL连接器在返回datetime类型数据时,直接返回了Python原生的datetime.datetime对象,但Django 2.0.x的认证/会话流程里,有部分逻辑还在假设这个值是字符串,所以调用了split()方法,导致报错。另外你同时装了mysqlclient和mysql-connector-python,也可能引发引擎调用的混淆。
可行的解决方案
方案1:降级MySQL连接器版本
把mysql-connector-python降到和Django 2.0.x兼容的版本,比如8.0.10:
# 卸载当前版本 pip uninstall mysql-connector-python -y # 安装兼容版本 pip install mysql-connector-python==8.0.10
然后重启Django服务,再试登录Admin。
方案2:切换到mysqlclient引擎
如果降级连接器没用,试试用mysqlclient作为数据库引擎(注意:Windows需要提前装VC++编译工具,Linux要装libmysqlclient-dev依赖):
- 修改
settings.py里的数据库配置:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 替换成mysqlclient对应的引擎 'NAME': '你的数据库名', 'USER': '数据库用户名', 'PASSWORD': '数据库密码', 'HOST': 'localhost', 'PORT': '3306', } }
- 确保mysqlclient正常安装(你已经装了1.3.12,这步可以跳过):
pip install mysqlclient==1.3.12
- 重新跑一遍迁移(避免残留问题):
python manage.py migrate
重启服务后再尝试登录。
方案3:排查自定义代码
如果上面两个方案都不行,就得检查你自己的应用(比如picker_main)里有没有自定义模型、认证后端或者中间件错误地处理了datetime数据。可以先把picker_main从INSTALLED_APPS里移除,测试是否还会报错,逐步定位问题点。
验证方法
完成任一方案后,启动服务:
python manage.py runserver
访问http://localhost:8000/admin/login/,用管理员账号登录,确认报错是否消失。
内容的提问来源于stack exchange,提问作者XSHA

