django 找不到视图...找不到页面错误

django can't find views...page not found error

我正在尝试打印来自视图的响应..但是 django 显示页面未找到错误 (404)

我的主要project.urls是:-

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf import settings
from . import views

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'ultimatefinalblog.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),
    url(r'^$',views.siteindex,name="siteindex"),
    url(r'^blog/', include('blog.urls')),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^markdown/', include('django_markdown.urls')),

)

我的博客 urls.py 是:-

from django.conf.urls import patterns,  url
from blog import views

urlpatterns = patterns('',
    #url(r'^$', views.BlogIndex.as_view(), name="index"),
    #url(r'^(?P<slug>\S+)$', views.BlogDetail.as_view(), name="entry_detail"),
    #url(r'^$', views.testview, name="testview"),
    url(r'^$', views.index, name="index"),
    url(r'^(?P<slug>\S+)$', views.detail, name="entry_detail"),
    url(r'^testingpage/', views.testview, name='testview'),
    )

我已经在 views.py

中定义了 testview 函数
def testview(request):
    return HttpResponse("testing our view!")

当我尝试在我的开发服务器中 运行 url 127.0.0.1:8000/blog/testingpage 时它显示页面未找到错误...有人可以帮我解决吗这个问题?

这是您的问题:

在你的 URL 模式中,

url(r'^(?P<slug>\S+)$', views.detail, name="entry_detail"),
url(r'^testingpage/', views.testview, name='testview'),

testingpage 正在与 ?P<slug>\S+(对于 views.detail)匹配,在 views.testview 之前,您可能有 raise 404 或类似的行匹配 slug 的代码。

所以,更改顺序:

url(r'^testingpage/', views.testview, name='testview'),
url(r'^(?P<slug>\S+)$', views.detail, name="entry_detail"),

它应该适合您。

此外,Slug 通常与 (?P<slug>[\w-]+) 匹配,而不是 \S+

所以! 我成功地让你的代码工作了。

我将把这个答案分为三个部分(注意:这将是详尽无遗的!):

  • 第一个:

我会复制我做的代码(和你的几乎一样,加上你没有提供的部分,我不得不重新编码——这些都是非常基本的,只是为了填补缺失的部分)。我希望它能帮助您通过比较找到解决问题的方法。我也会对你的问题给出一个假设。

  • 第二个:

我来谈谈你的代码。有一些好习惯可以帮助您构建您的 django 项目(但您似乎没有使用这些)。请注意,您的代码可以在不使用这些的情况下工作。但如果没有这些习惯,可能会更难。

  • 第三个:

我会建议您的代码的更正版本,并附有说明第二部分的注释。

首先 - 在我的电脑上运行的代码:

我用 django 1.7.5 制作了我自己的项目版本。 我是这样组织项目的:

.
├── blog
│   ├── __init__.py
│   ├── admin.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── main
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   ├── views.py
│   └── wsgi.py
└── manage.py

其中“main”是项目名称,“blog”是应用程序。

从一个新项目开始,我必须 modify/add 的文件是:

blog/urls.py :

from django.conf.urls import patterns,  url
from blog import views

urlpatterns = patterns('',
                       #url(r'^$', views.BlogIndex.as_view(), name="index"),
                       #url(r'^(?P<slug>\S+)$', views.BlogDetail.as_view(), name="entry_detail"),
                       #url(r'^$', views.testview, name="testview"),
                       url(r'^$', views.index, name="index"),
                       url(r'^(?P<slug>\S+)$', views.detail, name="entry_detail"),
                       url(r'^testingpage/', views.testview, name='testview'),
)

blog/views.py :

from django.shortcuts import render, HttpResponse

# Create your views here.

def testview(request):
    return HttpResponse("testing our view!")

def index(request):
    return HttpResponse("Index.")

def detail(request, slug="test"):
    return HttpResponse("Detail : " + slug)

main/urls.py :

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf import settings
from . import views

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'main.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^$',views.siteindex,name="siteindex"),
    url(r'^blog/', include('blog.urls')),
    url(r'^admin/', include(admin.site.urls)),
    url(r'^markdown/', include('django_markdown.urls')),
)

main/views.py :

from django.shortcuts import render, HttpResponse

# Create your views here.

def siteindex(request):
    return HttpResponse("site index!")

那我就做:

>>>python manage.py migrate
>>>python manage.py runserver

而且我可以访问 http://127.0.0.1:8000/blog/testingpage/ 和其他页面。我这样没问题。

但是我这样做了,你会看到这个 URL 与 r'^(?P<slug>\S+)$' 模式相匹配。因此 /blog/testingpage 不会触发视图 testview 但会触发视图 detail。 所以我认为你的问题可能来自 detail 视图,你可以将它添加到你的问题中进行检查吗?

其次 - 如何改进代码:

  • 应用程序和视图导入

您导入视图的方式是实用的,但可能不切实际 您可以在 main/settings.py 中将包含您的观点的应用程序(“blog”)添加到 INSTALLED_APPS。您只需将视图的名称作为字符串输入即可使用您的视图。

编辑:

This changed with the 1.8 release,现在建议按照你的方式去做。我的错。

  • 您的项目不是应用程序。

您的 /main/urls.py 表明您在 /main 目录中有一个 views.py . 以这种方式使用此目录并未明确禁止,但这是应用程序的目的。 /main 目录用于包含常规设置。 我认为你应该为你的 views.py(可能还有一些 url 模式)制作第二个应用程序,如果你不想将它插入“博客”应用程序

  • url图案顺序

使用您的 blog/urls.py 文件,您的应用程序将 "works"。但是 /blog/testingpage/ 会触发 detail 视图而不是 testview 视图,我'我不确定那是你想要做的。注意模式顺序!

第三 - 另一种方法:

这是我的代码版本。 我是这样组织项目的:

.
├── blog
│   ├── __init__.py
│   ├── admin.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── main
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
└── website
    ├── __init__.py
    ├── admin.py
    ├── models.py
    ├── tests.py
    ├── urls.py
    └── views.py

新文件是:

blog/urls.py

from django.conf.urls import patterns, url
# You don't need this anymore
# from blog import views 

urlpatterns = patterns('blog.views',  # this first argument will be used as a prefix to locate your views.
                       url(r'^$', 'index' , name="index"),
                       # beware the order!
                       # url(r'^(?P<slug>\S+)$', views.detail, name="entry_detail"),
                       url(r'^testingpage/', 'testview', name='testview'),
                       url(r'^(?P<slug>\S+)$', 'detail', name="entry_detail"),
)

blog/views.py

from django.shortcuts import render, HttpResponse

# Create your views here.

def testview(request):
    return HttpResponse("testing our view!")

def index(request):
    return HttpResponse("Index.")

def detail(request, slug="test"):
    return HttpResponse("Detail : " + slug)

INSTALLED_APP in main/settings.py (/!\ 重要 /!\)

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'website',
)

main/urls.py

from django.conf.urls import patterns, include, url
from django.contrib import admin

urlpatterns = patterns('',
    # Examples:
    # url(r'^$', 'main.views.home', name='home'),
    # url(r'^blog/', include('blog.urls')),

    url(r'^admin/', include(admin.site.urls)),
    url(r'^blog/', include('blog.urls')),
    url(r'^markdown/', include('django_markdown.urls')),
    url(r'^$', include('website.urls')),
)

website/urls.py

from django.conf.urls import patterns, include, url
from django.contrib import admin
from django.conf import settings
# If you add the app name to INSTALLED_APP you don't need this anymore.
# from . import views

urlpatterns = patterns('website.views', # This first argument will be used as a prefix to locate your views.
    url(r'^$', 'siteindex', name="siteindex"),
)

website/views.py

from django.shortcuts import render, HttpResponse

# Create your views here.

def siteindex(request):
    return HttpResponse("site index!")

希望以上内容对您有所帮助。