访问Django/admin页面出现DoesNotExist错误,特定链接可正常显示求助
解决Django访问/admin出现DoesNotExist错误的问题
问题分析
访问http://127.0.0.1:8000/admin时抛出DoesNotExist错误,但访问带next参数的登录链接正常,核心原因是:请求/admin时被错误路由到了你的index视图,而视图中执行ToDoList.objects.get(name='admin')时,数据库里不存在名为admin的ToDoList实例,因此触发异常。
解决方案
1. 检查并修正路由规则
你提供的项目urls.py中,path('admin/', admin.site.urls)确实排在include("main.url")之前,但问题大概率出在main应用的urls.py中——里面可能存在一个能匹配任意字符串的路由规则(比如<str:name>),导致/admin路径被误匹配。
比如,如果你的main/urls.py是这样的:
from django.urls import path from . import views urlpatterns = [ path('<str:name>', views.index), ]
这种情况下,访问/admin时,Django会将admin作为name参数传入index视图,触发不存在的查询。
修正方法:给业务路由添加前缀,避免和admin路由冲突:
# main/urls.py from django.urls import path from . import views urlpatterns = [ # 给你的列表页面添加前缀,比如/list/ path('list/<str:name>', views.index), ]
这样只有访问http://127.0.0.1:8000/list/xxx时才会触发index视图,不会干扰/admin的正常路由。
2. 验证Admin模型注册(可选但推荐)
虽然不是当前错误的直接原因,但确保你在main/admin.py中注册了模型,才能在admin后台正常管理数据:
# main/admin.py from django.contrib import admin from .models import ToDoList, Items admin.site.register(ToDoList) admin.site.register(Items)
3. 验证数据库数据(临时 workaround)
如果你的业务逻辑确实需要name='admin'的ToDoList实例,可以通过Django shell创建:
python manage.py shell
然后执行:
from main.models import ToDoList ToDoList.objects.create(name='admin')
不过这只是临时方案,更合理的做法还是通过路由前缀隔离业务和admin路径。
内容的提问来源于stack exchange,提问作者ArnavK
相关产品推荐
相关产品推荐

