Python + Django URL & 尝试 POST to_do 项目时查看错误

Python + Django URL & View errors when attempting to POST to_do item

这是我第一次尝试使用 Django,我 运行 遇到了 URL & Views 文件的问题。我创建了一个名为“阅读”的项目。在那个项目中,我创建了两个应用程序,“产品”和“语音”。在“语音”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>

当我尝试将项目添加到待办事项模型时,出现此错误“当前路径 addTodo/ 与其中任何一个都不匹配”。我尝试将“语音”添加到以下形式:

<form action="speech/addTodo/" method="POST">{% csrf_token %}

然而,我现在得到这个错误:

当前路径 speech/todo/speech/addTodo/ 与其中任何一个都不匹配。

当我在 /addTodo 操作前添加“语音”时,为什么会复制路径?

不确定这是否与错误有关,但在我实施项目级“模板”目录之前,我为每个应用程序提供了自己的“模板”目录。在这些目录中,我创建了一个包含单独内容的“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 %}