我的 Django 项目是一个单一应用程序网站,其主页显示我的数据库中的文章/帖子,并将包含标签主题和年/月档案的页面。所有其他页面都是照片和视频库的静态页面,以及关于页面 - 它们根本不使用数据库。
我正在尝试显示其中一个静态页面,但我不断遇到 404 错误,并显示以下内容(注意:我用“
No article found matching the query
Request Method: GET
Request URL: http://127.0.0.1:8000/illustrations
Raised by: <app_name>.views.ArticleDetailView
Using the URLconf defined in website.urls, Django tried these URL patterns, in this order:
admin
[name='home']
<slug:slug> [name='article_detail']
The current path, illustrations, matched the last one.
首页以ListView显示所有文章,点击单篇文章即可以指定slug为URL在DetailView中查看。 “插图”文件是一个单独的静态 HTML 页面,我将使用它,与数据库或列表或详细视图无关。
我不知道是否应该将主页设为单独的应用程序,或者我是否只需要更改我的 URL/视图文件。 (我正在学习 Django 和 Python,所以我肯定是在学习的过程中学习的。)
这里是views.py:
from django.shortcuts import render
from django.views import generic
from .models import Article
from django.http import JsonResponse # Ignore for now, I just put this here for when I work on making a JSON feed
class ArticleListView(generic.ListView):
model = Article
paginate_by = 6
template_name = "index.html"
class ArticleDetailView(generic.DetailView):
model = Article
template_name = "article.html"
def illustrations(request):
return render(request, "illustrations.html")
urls.py(项目):
from django.contrib import admin
from django.conf import settings
from django.urls import path, include
from django.conf.urls.static import static
urlpatterns = [
path('admin', admin.site.urls),
path("", include("<app_name>.urls")),
]
if settings.DEBUG: # new
urlpatterns + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urls.py(应用程序):
from django.urls import path
from . import views
from django.conf.urls.static import static # Not sure if needed
from django.views.generic import TemplateView
from .views import ArticleListView, ArticleDetailView
# For setup info, see https://learndjango.com/tutorials/django-file-and-image-uploads-tutorial
urlpatterns = [
path("", ArticleListView.as_view(), name="home"), # This is index.html,
path("<slug:slug>", ArticleDetailView.as_view(), name="article_detail"),
path("illustrations", views.illustrations, name="illustrations"),
]
这是因为 Django 不知道“插图”对于你的模型来说不是一个 slug。
slug
类型将匹配任何字母数字字符、连字符或下划线(正则表达式 [A-Za-z0-9-_]
。
Django 始终继续使用第一个匹配的 url 模式,因此它永远不会到达您想要的“插图”url。
1。将“插图”网址模式移至 ArticleDetailView 上方
# <app>.urls.py
urlpatterns = [
path("", ArticleListView.as_view(), name="home"), # This is index.html,
path("illustrations", views.illustrations, name="illustrations"),
path("<slug:slug>", ArticleDetailView.as_view(), name="article_detail"),
]
-注意:您也可以将最
illustrations
改为您的 project.urls
,因为这会首先被评估。
2。添加 DetailView url 前缀,使“插图”不匹配
# <app>.urls.py
urlpatterns = [
path("", ArticleListView.as_view(), name="home"), # This is index.html,
path("articles/<slug:slug>", ArticleDetailView.as_view(), name="article_detail"),
path("illustrations", views.illustrations, name="illustrations"),
]
专业提示:如果您遇到更多模板/视图/url 等问题,请查看 django-debug-toolbar。 <5 minutes to set up and gives WAY more useful debug info than vanilla django.