Как сопоставить URL с представлениями в django?
Гол:
127.0.0.1:8000/about
Должен дать:
добро пожаловать на страницу о нас
127.0.0.1:8000/contact
Должен дать:
добро пожаловать на страницу контактов
Проблема:
Оба выдают "страница не найдена по адресу /"
Эта ошибка:
Вот моя структура папок:
Это urls.py моего основного проекта "taskmate":
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('task/',include('todolist_app.urls')),
path('todolist/',include('todolist_app.urls')),
]
Для todolist_app, вот мои данные:
Urls.py:
from django.urls import path
from todolist_app import views
#from . import views
urlpatterns = [
path('', views.todolist),
path('contact', views.contact,name='contact'),
path('about', views.about, name="about"), #the path can be anything.
]
Views.py:
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def todolist(request):
context={'welcome_text':"welcome to todo list app"}
return render(request, 'html/todolist.html',context)
def contact(request):
context={'welcome_text':"welcome to contact page"}
return render(request, 'html/contact.html',context)
def about(request):
context={'welcome_text':"welcome to to about us page"}
return render(request, 'html/about.html',context)
Я подозреваю, что проблема в моем основном проекте urls.py, поскольку я не включил туда никаких подробностей о контактах и об URL. Поэтому я сделал там следующее.
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('task/',include('todolist_app.urls')),
path('todolist/',include('todolist_app.urls')),
path('about/',include('todolist_app.urls')),
]
Сайт работает, но цель не достигнута. Это очевидно, потому что about/ отображается на тот же URL, что и todolist/
Он показывает, что URL
http://127.0.0.1:8000/task/
И
http://127.0.0.1:8000/todolist/
показывали вместо того, что должны были показывать.
Теперь, я думаю, мне нужно исправить todolist_app urls.py
from django.urls import path
from todolist_app import views
#from . import views
urlpatterns = [
path('', views.todolist),
path('contact', views.contact,name='contact'),
path('about', views.about, name="about"), #the path can be anything.
]
Я не уверен, как это исправить. Первое, что я не понимаю, это
path('', views.todolist),
должно означать, что любой url 127.0.0.1:8000/ должен давать "welcome to todolist app", но только 127.0.0.1:8000/todolist дает его.
А отображение представлений для "contact" и "about" явно не работает.
Как исправить эту проблему?
Итак, чтобы достичь вашей цели, мы должны изменить url-файл проекта следующим образом:
path('admin/', admin.site.urls),
path('task/',include('todolist_app.urls')),
path('',include('todolist_app.urls')), # change as this
Тогда вы можете получить
127.0.0.1:8000/about
показывает "welcome to about page"
127.0.0.1:8000/contact
показывает "welcome to contact page"
127.0.0.1:8000/
показывает "welcome to todolist app page"
Проблема заключалась в том, что в url файле проекта, когда вы добавляете path('todolist/',include('todolist_app.urls'))
, каждый url в приложении todolist
будет иметь префикс с данной строкой в url файле проекта.
Для получения дополнительной информации вы можете обратиться к Django - URL Mapping.
Добавьте косую черту после вашего маршрута:
from django.urls import path
from todolist_app import views
urlpatterns = [
path('', views.todolist),
path('contact/', views.contact,name='contact'),
path('about/', views.about, name='about'), #the path can be anything.
]