需要帮助修复 Django 404 错误,无法使用 URLConf 找到静态页面

问题描述 投票:0回答:1

我的 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"),
]
python django
1个回答
0
投票

这是因为 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/API 命名方案。建议您也将 ListView 更改为“/articles/”。当您只有一个应用程序时,这不是问题,但一旦添加另一个应用程序(例如“社论”或其他应用程序),就可以轻松使用“/社论/”和“/社论/”复制 URL 方案。

专业提示:如果您遇到更多模板/视图/url 等问题,请查看 django-debug-toolbar。 <5 minutes to set up and gives WAY more useful debug info than vanilla django.

© www.soinside.com 2019 - 2024. All rights reserved.