django无法找到视图...页面未找到错误

时间:2015-05-15 18:27:28

标签: python django django-views django-urls

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

我的主要项目是: -

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时,它显示找不到页面错误...有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:4)

以下是您的问题:

在您的网址格式中

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

testingpage之前?P<slug>\S+views.detailviews.testview)匹配,您可能有raise 404或类似的代码行匹配slu ..

所以,改变顺序:

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

它应该适合你。

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

答案 1 :(得分:0)

原来如此! 我成功地使你的代码工作。

我将在三个部分中组织这个答案(注意:这将是详尽无遗的!):

  • 第一:

我将复制我制作的代码(几乎和你的代码一样,加上你没有提供的部分,我不得不重新编码 - 这些是非常基本的,只是为了填补缺失的部分)。我希望它能帮助您找到如何通过比较来解决您的问题。我还会假设你的问题。

  • 第二名:

我会谈谈你的代码。有良好的习惯可以帮助你建立你的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 ”是应用程序。

从一个新项目中,我必须修改/添加的文件是:

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/和其他页面。我没有这个问题。

但是,如果我这样做,您会看到此网址与r'^(?P<slug>\S+)$'模式匹配。因此 / blog / testingpage 不会触发视图 testview ,而是触发视图详细信息。 所以我认为您的问题可能来自详细信息视图,您可以将其添加到您的问题中进行检查吗?

第二 - 如何改进代码:

  • 应用和视图导入

导入视图的方式是功能性的,但它可能是不可原谅的 您可以将包含视图的应用(“博客”)添加到 main / settings.py 中的INSTALLED_APPS。只需将其名称输入字符串,您就可以使用您的观点。

编辑:

This changed with the 1.8 release,现在建议像你一样做。我的坏。

  • 您的项目不是应用。

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

  • urlpatterns order

使用 blog / urls.py 文件,您的应用将“正常运行”。但是 / blog / testingpage / 会触发详细信息视图而不是 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

新文件是:

<强>博客/ 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"),
)

<强>博客/ 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)
主页/ settings.py中的

INSTALLED_APP(/!\ Important /!\)

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

主要/ 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')),
)

网站/ 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"),
)

网站/ views.py

from django.shortcuts import render, HttpResponse

# Create your views here.

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

我希望所有这一切都会有所帮助。