这是我第一次尝试使用Django,我遇到了一个URL和; 查看文件。 我创建了一个名为“阅读”的项目。 在这个项目中,我创建了两个应用程序,“产品”和“语音”。 在“speech”urls.py文件中,我有以下代码:
from django.urls import path
from speech.views import todoView, addTodo
urlpatterns = [
path('todo/', todoView),
path('addTodo/', addTodo)
]
在views.py文件中,我有以下代码:
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render
from .models import TodoItem
def todoView(request):
all_todo_items = TodoItem.objects.all()
return render(request, 'todo.html',
{'all_items': all_todo_items})
def addTodo(request):
new_item = TodoItem(content = request.POST['content'])
new_item.save()
return HttpResponseRedirect('/todo/')
在项目文件夹的urls.py文件中,我有:
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('products/', include('products.urls')),
path('speech/', include('speech.urls'))
在项目文件夹的“templates”目录中,我有一个“todo.html”文件,其中包含:
<h1>This is the todo page</h1>
<ul>
{% for todo_item in all_items %}
<li>{{ todo_item.content}}</li>
{% endfor %}
</ul>
<form action="/addTodo/" method="POST">{% csrf_token %}
<input type="text" name="content" />
<input type="submit" value="Add" />
</form>
当我尝试向todo模型添加一个项时,我得到了这样一个错误:“当前路径,addTODO/,没有匹配任何这些”。 我试着在表单前加上“speech”,例如:
<form action="speech/addTodo/" method="POST">{% csrf_token %}
但是,我现在得到了这个错误:
当前路径speech/todo/speech/addtodo/与这些路径中的任何一个都不匹配。
为什么当我在/addToDo操作之前添加“speech”时,它会复制路径?
不确定这是否与错误相关联,但在我实现项目级别的“templates”目录之前,我给了每个应用程序自己的“templates”目录。 在这些目录中,我创建了一个带有单独内容的“index.html”文件。 当我为每个应用程序都有一个索引路径时,我无法让应用程序呈现与之关联的“index.html”文件。 相反,第二个应用程序似乎试图呈现第一个应用程序的“index.html”文件。 当涉及到Django中的模板时,是否有一个自上而下的规则?
你错过了一个斜杠
请尝试以下操作:
<form action="/speech/addTodo/" method="POST">{% csrf_token %}
一种更“Django”的方式可以是:
from django.urls import path
from speech.views import todoView, addTodo
urlpatterns = [
path('todo/', todoView),
path('addTodo/', addTodo, name='add-todo')
]
然后在模板中:
<form action="{% url 'add-todo' %}" method="POST">{% csrf_token %}