django urlpattern 里的namespace 和name 的用法

引入官方文档的定义:

app_name  应用命名空间(如果多个应用的url 里面的 name 相同,则需要

app_name:name 限定哪一个app的url name,如果name 唯一,直接写name 就可以找到对应的完整路径了)


namespace  实例命名空间(标记当前url的匹配部分),在总的urlpattern 里面就是 已经截获的 url 

path("post/",include(xx.urls,namespace='这个链接实例的名字,会存在于 request.resolver_match.namespace',app_name = "xx"))  # app_name ,这里不指定,就要在应用的url 里面指定

(因为可能多个顶级url链接到同一应用的url 的同一视图) 如post/index  和get/index 都指向了应用的 xxview,那么单纯的应用  url 里面的  name (应用命名)就无法找到具体的上级部分url 了),其实只有大规模使用命名空间代替绝对的url 时,才能用到,一般用到应用命名空间 的 name 已经够了,一般不会写那种不同 父级 url 参数,却对应同一应用的url 子集合

与URL匹配的URL模式的实例名称空间

下面引用刘江的博客的解释(感觉说的很到位)

http://www.liujiangblog.com/course/django/136

    path    ('post//',views.some_view),

假如有一系列链接是符合上面的url 匹配原则,例如: ip:端口 /post/3

万一有一天,我们改了,post为throw等其他字符串,那么如果页面中,都是写好的post /xx   url  ,难道要一个一个改吗?这样不是很好的方法,

最好的方法是用标记来代替写死的url,这个标记是什么呢?就是namespace  和name

引入自刘江博客

在需要解析URL的地方,对于不同层级,Django提供了不同的工具用于URL反查:

在模板语言中:使用 url 模板标签。(也就是写前端网页时)

在Python代码中:使用reverse()函数。(也就是写视图函数等情况时)

在更高层的与处理Django模型实例相关的代码中:使用get_absolute_url()方法。(也就是在模型model中)

先看看模版里面怎么使用:

url 模版标签

{%    url    'some-url-name'    v1    v2  %}

返回与给定视图和可选参数匹配的绝对路径引用

some-url-name 是URL模式名称。如name   或者 app_name :name  

(模版里会自动拿到当前请求的namespace ,所以就不用写了,如果和请求的namespace 无关的url ,那么则会找到最后一个 多url 部分匹配  同一应用的   部分 url  )

其他参数是可选的,应该是以空格分隔的值,这些值将用作URL中的参数

{%    url    'some-url-name'    arg1=v1    arg2=v2    %}

(或者使用关键字参数) 对应xxx?xx=xx..

在试图函数中:

reverse('polls:index',  current_app = self.request.resolver_match.namespace)

如果应用url 对应唯一的namespace  那就不需要current_app  这个参数了

如果和请求无关的url 那么同上面的 模版url ,会找到最后一个顶级部分的url 

基本理解了,还是很抽象的


你可能感兴趣的:(django urlpattern 里的namespace 和name 的用法)