【问题标题】:django can't find views...page not found errordjango 找不到视图...找不到页面错误
【发布时间】:2015-07-27 18:50:22
【问题描述】:

我正在尝试从视图中打印响应。但 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')),

)

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

【问题讨论】:

  • 如果您尝试使用 /blog/testingpage/ 而不是 /blog/testingpage 会发生什么?
  • 错误页面是否显示一些 URL 模式?
  • 其他 URL 是否有此错误?你能添加你的 settings.py 文件吗?

标签: python django django-views django-urls


【解决方案1】:

这是你的问题:

在您的 URL 模式中,

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

testingpageviews.testview 之前与?P&lt;slug&gt;\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&lt;slug&gt;[\w-]+) 而不是\S+

【讨论】:

  • 非常感谢..我能够解决我的问题 :)
【解决方案2】:

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

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

  • 第一:

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

  • 第二:

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

  • 第三:

我将建议您使用 cmets 的代码的更正版本来说明第二部分。

首先 - 在我的计算机上运行的代码:

我用 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”是应用程序。

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

博客/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:

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)

ma​​in/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')),
)

ma​​in/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&lt;slug&gt;\S+)$' 模式匹配。因此 /blog/testingpage 不会触发视图 testview 而是视图 detail。 所以我认为您的问题可能来自 detail 视图,您可以将其添加到您的问题中进行检查吗?

第二 - 如何改进代码:

  • 应用和视图导入

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

编辑:

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

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

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

  • urlpatterns 顺序

使用您的 blog/urls.py 文件,您的应用将“工作”。但是 /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)

ma​​in/settings.py 中的 INSTALLED_APP (/!\ 重要 /!\)

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

ma​​in/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!")

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

【讨论】:

  • 谢谢..我的问题是博客的urls.py中的url顺序....现在解决了:)
猜你喜欢
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2017-01-04
  • 1970-01-01
相关资源
最近更新 更多