Проблема с отображением урлов на функции представления в Django
Я хочу сгруппировать все мои URL в моем приложении todo list в файл project/todolist/urls.py. Таким образом, у меня есть кнопка и поле String, где вы можете добавить элемент в список, и когда вы нажимаете на кнопку, она должна отправить строку в модель данных и перенаправить обратно на домашнюю страницу с обновленным списком. Это работает, когда я разместил все урлы в файле project/urls.py, как показано ниже:
urlpatterns = [
url(r'^admin/', admin.site.urls),
url('todo_list/', include('todolist.urls')),
url('addItem/', addItem),
url('deleteItem/(?P<i>[0-9]+)', deleteItem)
]
Но я хотел использовать функцию include() вместо этого и сгруппировать все представления add, delete и todo_list в один файл в project/todolist/urls.py. Но когда я делаю это, я получаю ошибки Page not found и такие:
Using the URLconf defined in test_django.urls, Django tried these URL patterns, in this order:
^admin/
todo_list/
The current path, addItem/, didn’t match any of these.
Ниже приведен код, который выдает ошибку. Я пытался изменить в html-шаблоне, чтобы действие формы переходило в /todo_list/addItem/
вместо /addItem/
, но это почему-то не решает проблему.
*** project/todolist/urls.py ***
from django.urls import path
from . import views
urlpatterns = [
path('', views.get_todo),
path('addItem/', views.addItem),
path('deleteItem/(^?P<i>[0-9]+$)', views.deleteItem)
]
*** project/urls.py ***
urlpatterns = [
url(r'^admin/', admin.site.urls),
url('todo_list/', include('todolist.urls')),
]
*** project/todolist/views.py ***
def get_todo(request):
"""Function performed when we open the homepage"""
# our model allows us to get items from the DB into the view
# get all current items from the DB
all_todo_items = TodoListItem.objects.all()
logging.debug(all_todo_items)
# create empty form where new items can be added
form = TodoForm()
# we always want to display the empty form and the list of todo items
todo = {'todo': all_todo_items,
'form': form
}
return render(request, "todo.html", todo)
@csrf_exempt
def addItem(request):
"""Function performed when we click the submit button"""
logging.debug(print(request.POST))
form = TodoForm(request.POST)
if form.is_valid():
new_item = TodoListItem()
new_item.content = form.cleaned_data['todo']
new_item.save()
return HttpResponseRedirect('/todo_list/')
def deleteItem(request, i):
"""Function when we click delete button"""
#item = get_object_or_404(TodoListItem, pk=i)
item = TodoListItem.objects.get(id = i)
item.delete()
return HttpResponseRedirect('/todo_list/')
<><>*** project/todolist/templates/todo.html ***
<><h1> ToDo List </h1>
<form action="/todo_list/addItem/" method="post">{% csrf_token %}
<div>
{{ form }}
<input type="submit" value="Add Todo Item">
</div>
</form>
<p>
Current List:
<ul>
{% for item in todo %}
<li> {{ item }} </li>
<form action="/todo_list/deleteItem/{{item.id}}" method = "post">
{% csrf_token %}
<input type="submit" value="Delete">
</form>
{% endfor %}
</ul>
</p>
У меня есть похожая функциональность, которую я недавно создал, и я думаю, что в вашем шаблоне вы должны использовать следующее:
<form action="{% url ‘deleteItem’ item.id %}" method = "POST">
Для использования include вам понадобится вот это, я думаю:
urlpatterns = patterns('',
url(r'^some_base_url/', include('your_app.urls')),
)
Найдено здесь Добавление URL из приложения Django
Я думаю, что документация django объясняет это довольно хорошо, если вы хотите взглянуть
https://docs.djangoproject.com/en/dev/topics/http/urls/#including-other-urlconfs