无法使用反向名称解析路径的URL字符串

时间:2018-09-24 06:36:48

标签: python django

我一周的大部分时间都在学习Django,以建立自己的网站,但我偶然发现了一个似乎无法正常工作的问题。我希望通过在路径中包含particular name,然后能够在行中reference来命名该路径,以解析该路径的URL字符串。直到我更改路径中的路由以使用include方法,该方法才能正常工作。

第一次尝试:

from django.url import include, path
from . import views

urlpatterns = [
    path('testapp/', include('testapp.urls'), name='testapp'),
    path('about/', views.about, name='about'),
]

现在,当我从模板html文件中调用{% url 'about' %}时,我按预期返回了'/about/',但是当我尝试调用{% url 'testapp' %}时却得到了NoReverseMatch异常,而不是'/testapp/'。在仔细阅读了文档之后,我偶然发现了this的示例,该示例显示了包含使用名称空间的路径,因此我对上面的内容进行了一些修改。

第二次尝试:

# from mysite/urls.py (adapted from before)
from django.url import include, path
from . import views

urlpatterns = [
    path('testapp/', include('testapp.urls', namespace='testapp')),
    path('about/', views.about, name='about'),
]


#from testapp/urls.py
from django.url import include, path
from . import views

app_name = 'testapp_name'

urlpatterns = [
    path('', views.index, name='testapp_index'),
    path('directory/', views.directory, name='testapp_directory'),
]

现在,从上一个示例中,我尝试使用名称空间代替名称{% url 'testapp' %},但是我再次遇到相同的NoReverseMatch异常,但是使用包含的URL {% url 'testapp:directory' %}中的名称空间和名称确实可以给我'/testapp/directory/'

我知道有些概念我没有得到理解,或者我忽略了一些东西,但是我现在只是在圈子里转转,我真的很感谢有人可以给我任何帮助。

如果有帮助,我正在尝试获取路径,以便可以在导航栏中使用它来突出显示当前激活的选项卡。我也没有对路径进行硬编码,因为我尝试将其保留为DRY,尽管在这一点上我可能无法完成,但是我希望有人对它有更好的了解他们正在做,并且可以为我指出一个有用的方向。感谢您的协助,谢谢!

2 个答案:

答案 0 :(得分:1)

{% url 'testapp_name:testapp_index' %} 

{% url 'testapp_name:testapp_directory' %}

在urls文件中使用app_name时,您需要在视图名称中提及它

答案 1 :(得分:1)

问题在于testapp不是单个视图:它是include(..),因此它封装了视图的集合

from django.url import include, path
from . import views

urlpatterns = [
    path('testapp/', include('testapp.urls'), name='testapp'),
    path('about/', views.about, name='about'),
]

这并不是说此集合完全包含一个视图,也可以包含多个视图。即使它只包含一个视图,也将是不安全的,因为以后您可以改变主意并添加一个额外的视图。

如果有两个或更多视图,那么您将如何决定采用哪个视图(以及URL)?如果include(..)有两个视图:“主页”和个人资料页面,则将有很大的不同。

因此,您应该使用真实姓名,并且是否在include(..)中给include(..)命名空间是无关紧要的:

{% url 'testapp_name:testapp_index' %} <!-- first attempt -->
{% url 'testapp:testapp_index' %} <!-- second attempt -->

引用 real 视图的名称。