Django POST待办项时URL与视图报错及模板加载问题咨询
你的Django路径与模板问题解决方案
嗨,我来帮你一步步解决这两个问题~
一、路径匹配错误与重复问题
咱们先搞清楚为什么会出现这两个报错:
1. 初始报错「addTodo/ 不匹配任何路径」的原因
你的项目根URL配置里,speech应用的所有路径都挂在/speech/前缀下:
# 根urls.py path('speech/', include('speech.urls'))
而你表单里的action="/addTodo/"是绝对路径,它会直接去根目录找/addTodo/,但根URL里根本没有这个路径——addTodo/是属于speech应用的,正确的绝对路径应该是/speech/addTodo/。
2. 路径重复「speech/todo/speech/addTodo/」的原因
你改成action="speech/addTodo/"后,这是相对路径,当前页面的URL是/speech/todo/,相对路径会在当前路径的基础上拼接,所以就变成了/speech/todo/speech/addTodo/,自然就重复了。
正确的解决方案
推荐两种方式,第二种更符合Django的最佳实践:
方式一:使用完整绝对路径
直接把表单action改成根开始的绝对路径:<form action="/speech/addTodo/" method="POST">{% csrf_token %}同时记得把视图里的重定向也改成绝对路径:
return HttpResponseRedirect('/speech/todo/')方式二:使用命名URL(更灵活)
这种方式不用硬编码路径,以后修改URL前缀也不用改模板和视图:- 给
speech/urls.py里的路径加上name参数:from django.urls import path from speech.views import todoView, addTodo urlpatterns = [ path('todo/', todoView, name='todo-view'), path('addTodo/', addTodo, name='add-todo') ] - 模板里用
{% url %}标签生成路径:<form action="{% url 'add-todo' %}" method="POST">{% csrf_token %} - 视图里用
reverse()生成重定向路径(记得导入reverse):from django.urls import reverse def addTodo(request): new_item = TodoItem(content = request.POST['content']) new_item.save() return HttpResponseRedirect(reverse('todo-view'))
- 给
二、模板渲染优先级问题
你猜的没错,Django的模板查找确实有自上而下的顺序,规则是这样的:
Django会按照settings.py里INSTALLED_APPS的顺序去查找模板。当两个应用都有同名模板(比如index.html)时,它会先找到第一个应用里的模板,直接使用,不会再去后面的应用找。
解决方法:给每个应用的模板加「应用名子目录」
这是Django推荐的规范,能彻底避免模板混淆:
- 调整每个应用的模板目录结构:
speech应用的模板应该放在:speech/templates/speech/index.htmlproducts应用的模板放在:products/templates/products/index.html
- 视图里渲染模板时,指定完整的路径:
# speech/views.py def index(request): return render(request, 'speech/index.html')# products/views.py def index(request): return render(request, 'products/index.html')
这样Django就能精确找到对应应用的模板,不会再出现“串模板”的问题了。
内容的提问来源于stack exchange,提问作者pghInitechBranch
相关产品推荐
相关产品推荐

