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!")
希望以上内容对您有所帮助。
我正在尝试打印来自视图的响应..但是 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!")
希望以上内容对您有所帮助。