Python + Django URL и ошибки просмотра при попытке POST to_do элемента - PullRequest
0 голосов
/ 09 июля 2020

Это моя первая попытка использовать Django, и я столкнулся с проблемой с файлами URL и просмотров. Я создал проект под названием «чтение». В рамках этого проекта я создал два приложения: «продукты» и «речь». В файле 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 /, didn ' t соответствует любому из них.

Почему он дублирует путь, когда я добавляю слово «речь» к действию / addTodo?

Не уверен, связано ли это с ошибкой, но до того, как я реализовал каталог «шаблонов» уровня проекта, я дал каждому приложению свой собственный каталог «шаблонов». В этих каталогах я создал файл index. html с отдельным содержимым. Когда у меня был путь к индексу для каждого приложения, я не мог заставить приложения отображать связанный с ним файл index. html. Вместо этого казалось, что второе приложение пытается отобразить файл index. html первого приложения. Есть ли правило «сверху вниз», когда дело касается шаблонов в Django?

1 Ответ

1 голос
/ 09 июля 2020

Вы пропустили sla sh

Попробуйте следующее:

<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 %}
...