所以!
我成功地让你的代码工作了。
我将把这个答案分成三个部分(请注意:这将是详尽无遗的!):
我将复制我制作的代码(几乎和你的一样,加上你没有提供的部分,我不得不重新编码——这些非常基本,只是为了填补缺失的部分)。我希望它可以帮助您通过比较找到解决问题的方法。我也会对你的问题给出一个假设。
我会谈谈你的代码。有一些好习惯可以帮助你构建你的 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)
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 视图,您可以将其添加到您的问题中进行检查吗?
第二 - 如何改进代码:
您导入视图的方式是实用的,但它可能是不切实际的
您可以将包含您的视图的应用程序(“blog”)添加到 main/settings.py 中的INSTALLED_APPS。您只需将视图名称作为字符串输入即可使用视图。
编辑:
This changed with the 1.8 release,现在建议像你一样做。我的错。
您的 /main/urls.py 表明您的 /main 目录中有一个 views.py。
没有明确禁止以这种方式使用此目录,但这是应用程序的目的。 /main 目录旨在包含常规设置。
如果您不想将其插入“blog”应用程序,我认为您应该为您的 views.py(可能还有一些 url 模式)制作第二个应用程序。
使用您的 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)
main/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',
)
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')),
)
网站/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!")
我希望所有这些都会有所帮助。