我一周的大部分时间都在学习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,尽管在这一点上我可能无法完成,但是我希望有人对它有更好的了解他们正在做,并且可以为我指出一个有用的方向。感谢您的协助,谢谢!
答案 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 视图的名称。