问题描述
我在一周的大部分时间里都在学习Django,以建立自己的网站,但我偶然发现了一个似乎无法解决的问题。 我希望通过在路径中包含一个来解析该路径的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'),
]
现在,当我打电话{% url 'about' %}
从我的模板的html文件,我回去'/about/'
如预期,但是当我尝试和呼叫{% url 'testapp' %}
我得到一个NoReverseMatch
例外,而不是让'/testapp/'
。
在仔细阅读了文档之后,我偶然发现了示例, 示例显示了使用include代替使用命名空间的路径,因此我对上面的内容进行了一些修改。
第二次尝试:
# 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 'testapp:directory' %}
确实可以给我'/testapp/directory/'
。
我知道有些想法我没听懂或我忽略了,但是我现在只是在圈子里转转,我真的很感谢别人能给我的任何帮助。
如果有帮助,我正在尝试获取路径,以便可以在导航栏中使用它来突出显示当前激活的选项卡。 我也没有对路径进行硬编码,因为我尝试将其保持为尽管在这一点上我可能无法完成,但我希望有人对他们的工作有更好的了解并可以为我指出一个有用的方向。 感谢您的协助,谢谢!
1楼
{% url 'testapp_name:testapp_index' %}
要么
{% url 'testapp_name:testapp_directory' %}
当您在urls文件中使用app_name
时,您需要在视图名称中提及它
2楼
问题在于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 -->
引用真实视图的名称。