【问题标题】:Django how to define default app for home URL?Django 如何为主页 URL 定义默认应用程序?
【发布时间】:2015-06-19 08:46:36
【问题描述】:

我正在学习 Django,到目前为止我总是不得不使用 URL 之类的

projectname/appname/viewname

但是如果我不希望 appname 出现在“默认”应用程序的 URL 中,我该如何配置我的 URL,以便

projectname/viewname

会从我的默认应用加载视图viewname

P.S.:当然,我的主要目标是能够使用 URL projectname/ 为默认应用加载默认视图。

详情

目前我的 ProjectName/urls.py 有这个:

urlpatterns = patterns('',
url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
    {'document_root', settings.STATIC_ROOT}
  ),                                          
    url(r'^admin/', include(admin.site.urls)),
    url(r'^myapp1/', include('myapp1.urls', namespace='myapp1', app_name='myapp1')),
    url(r'^myapp2/', include('myapp2.urls', namespace='myapp2', app_name='myapp2')),    
)

所以当我将我的项目部署到 Heroku 并访问 myproject.heroku.com 时,我得到了错误:

Page not found (404)
Request Method: GET
Request URL:    https://myproject.herokuapp.com/
Using the URLconf defined in MyProject.urls, Django tried these URL patterns, in this order:
^static/(?P<path>.*)$
^admin/
^myapp1/
^myapp2/

我知道这应该是,但我该如何修复(或破解)它以使 myproject.heroku.com 工作?

如果不可能,如何将主页重定向到 myproject/myapp1/defaultview ? 提前致谢!

我的应用的 urls.py 看起来像这样:

urlpatterns = patterns('myapp1.views',
    url(r'^view1/$', 'view1', name='view1'), # the default view
    url(r'^view2/(?P<oid>\d+)/(?P<pid>\d+)/$', 'view2', name='view2'),
)

编辑

在尝试@Wallace 的建议url(r'^$', include('myapp1.urls', namespace='myapp1', app_name='myapp1')), 并点击主页后,我现在得到了错误:

Using the URLconf defined in myproject.urls, Django tried these URL patterns, in this order:
^static/(?P<path>.*)$
^admin/
^$ ^view1/$ [name='view1']
^$ ^view2/(?P<oid>\d+)/(?P<pid>\d+)/$ [name='view2']
^myapp2/

【问题讨论】:

  • 你的myapp1urls.py怎么样?
  • 你试过url(r'', include('myapp1.urls', ...)吗?
  • @Anzel 添加到问题中。但它应该与这项任务无关,对吧?
  • @Anzel,你的建议有效!

标签: python django url view default


【解决方案1】:

尝试将您的项目 urls.py 更改为:

url(r'', include('myapp1.urls', ...)

这将包括来自myapp1.urls 的所有网址,它们都附加到/

r'^$' 不起作用的原因是因为正则表达式以 $ 结尾,这意味着只能有 1 个 url /,并且因为你的 app1.urls 只定义了 2 个 url 并且没有 @ 987654329@ 或 ^$ 等效项,则 url 解析器将失败。

但是注意 url 冲突,例如,如果您的项目有一个 ^view1/$ url,它将与您的 app1view1 冲突。

【讨论】:

    【解决方案2】:

    尽量不要在正则表达式中包含您的应用名称。

    url(r'', include('myapp1.urls', namespace='myapp1', app_name='myapp1')),
    

    【讨论】:

    • 谢谢,我试过了,把结果贴在问题的最后。
    • 试试 Anzel 的回答,我没有测试我的 b4 发帖。
    • @Wallace, ^$ 将不起作用,因为正则表达式仅表示 1 个 url,即 /。将其更改为 r'' 会将所有 app1.urls 附加到 / ,因此它将起作用
    猜你喜欢
    • 2012-10-27
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2016-03-17
    • 2012-04-07
    • 1970-01-01
    • 2017-02-14
    相关资源
    最近更新 更多