Django找不到视图…找不到页面

2024-04-24 16:30:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图从视图中打印一个响应。。但django显示页面未找到错误(404)

我的主项目.url是:

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')),

)

我博客的url.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时,它会显示页面未找到错误…有人能帮助我解决这个问题吗?


Tags: djangonamefromimportviewurlindexinclude
2条回答

这是你的问题:

在你的URL模式中

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

views.testview之前,testingpage?P<slug>\S+(用于views.detail)匹配,您可能有一个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”是一个应用程序。

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

博客/url.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'),
)

博客/浏览量.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/url.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')),
)

主视图/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”)。您只需输入视图的名称作为字符串就可以使用它们。

编辑:

This changed with the 1.8 release,现在建议你像以前那样做。我的错。

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

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

  • urlpatterns顺序

使用blog/urls.py文件,您的应用程序将“正常工作”。但是/blog/testingpage/将触发细节视图,而不是测试视图视图,我不确定这是您想要做的。注意图案顺序!

第三-另一种方法:

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

.
├── 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

新文件是:

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

博客/视图.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/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/url.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')),
)

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

网站/视图.py

from django.shortcuts import render, HttpResponse

# Create your views here.

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

我希望所有这些都会有帮助。

相关问题 更多 >