【问题标题】:Django admin fails when using includes in urlpatterns在 urlpatterns 中使用包含时 Django 管理员失败
【发布时间】:2011-01-28 17:51:57
【问题描述】:

我正在尝试稍微重构我的应用程序,以防止它变得过于笨拙。所以我开始按照文档的建议将一些 urlpatterns 移到子文件中。

除了它似乎不起作用(这些项目没有被重新路由)的事实之外,但是当我进入管理员时,它说'urlpatterns has not been defined'。

我的应用程序根目录中的 urls.py 是:

if settings.ENABLE_SSL:
urlpatterns = patterns('',
    (r'^checkout/orderform/onepage/(\w*)/$','checkout.views.one_page_orderform',{'SSL':True},'commerce.checkout.views.single_product_orderform'),
)
else:
    urlpatterns = patterns('',
    (r'^checkout/orderform/onepage/(\w*)/$','commerce.checkout.views.single_product_orderform'),
)

urlpatterns+= patterns('',
    (r'^$', 'alchemysites.views.route_to_home'),
    (r'^%s/' % settings.DAJAXICE_MEDIA_PREFIX, include('dajaxice.urls')),
    (r'^/checkout/', include('commerce.urls')),
    (r'^/offers',include('commerce.urls')),
    (r'^/order/',include('commerce.urls')),
    (r'^admin/', include(admin.site.urls)),
    (r'^accounts/login/$',  login),
    (r'^accounts/logout/$', logout),
    (r'^(?P<path>.*)/$','alchemysites.views.get_path'),
    (r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root':settings.MEDIA_ROOT}),

到目前为止,我移出的网址是结帐/优惠/订单,它们都是“商业”的子应用程序,其中应用程序的 urls.py 非常清楚。

/urls.py 中的问题(包含在此处)

/commerce/urls.py 我要包含的 urls.py 是:

order_info = {
'queryset': Order.objects.all(),
}


urlpatterns+= patterns('',


(r'^offers/$','offers.views.start_offers'),
(r'^offers/([a-zA-Z0-9-]*)/order/(\d*)/add/([a-zA-Z0-9-]*)/(\w*)/next/([a-zA-Z0-9-)/$','offers.views.show_offer'),
(r'^reports/orders/$', list_detail.object_list,order_info),
)

应用程序提供的服务属于商业。

另外一个问题是管理员根本无法工作,所以我在想是因为我在某个地方用我的包含杀死了它。

我检查过的内容: urlpatterns 变量是否意外在某处重置(即 urlpatterns = 模式,而不是 urlpatterns+= 模式) commerce.urls 中的模式是否有效(是的,当移回根目录时它们有效)。

所以从那里我很难过。我可以将所有内容移回根目录,但我试图稍微解耦,不仅仅是出于理论上的原因,还有一些短期原因。

最后,如果我输入 www.domainname/checkout/orderform/onepage/xxxjsd 我会得到正确的页面。但是,输入 www.domainname/checkout/ 由 alchemysites.views.get_path 处理。

如果不是答案(因为这是非常具体的),那么有没有解决 urls.py 问题的好方法?这似乎只是反复试验。似乎应该有某种解析器会告诉你你的 urlpatterns 会做什么。

【问题讨论】:

    标签: django django-urls


    【解决方案1】:

    在我的urls.py 中添加以下行对我有用:

    from django.conf.urls import include 
    

    【讨论】:

      【解决方案2】:

      查看including other url confs 的 django 文档。我想你可能误解了他们。特别是

      每当 Django 遇到 include() 时,它都会切断与该点匹配的 URL 的任何部分,并将剩余的字符串发送到包含的 URLconf 以进行进一步处理。

      举个例子,你有

      (r'^/checkout/', include('commerce.urls')),
      (r'^/offers',include('commerce.urls')),
      (r'^/order/',include('commerce.urls')),
      

      这意味着

      /checkout/offers/
      /offers/offers/
      /order/offers/
      

      将全部匹配commerce/urls.py中的url模式(r'^offers/$','offers.views.start_offers')

      如果要在commerce.py 中为/checkout/ 定义视图,则需要添加模式

      (r'^$', 'path_to_your_view')
      

      因为 /checkout/ 部分将被 include() 截断


      顺便说一句:

      /commerce/urls.py 中,使用

      urlpatterns = patterns('',
          ...
      

      对于您定义的第一个模式。然后,您可以稍后在同一文件中使用urlpatterns +=

      【讨论】:

      • 是的,就是这样。我将这些部分更深入地移动到 commerce.checkout.urls 等。是的,我确实误解了关于“切断”的部分,我认为这只是指尾部斜杠。谢谢
      猜你喜欢
      • 2012-01-06
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 2011-01-11
      • 1970-01-01
      • 2015-10-24
      • 2012-09-24
      相关资源
      最近更新 更多