簡單來說就是可以給我們的URL匹配規則起個名字,一個URL匹配模式起一個名字。
這樣我們以后就不需要寫死URL代碼了,只需要通過名字來調用當前的URL
舉個簡單的例子:
url(r'^home', views.home, name='home'), # 給我的url匹配模式起名(別名)為 home,別名不需要改,路徑你就可以隨便改了,別的地方使用這個路徑,就用別名來搞 url(r'^index/(\d*)', views.index, name='index'), # 給我的url匹配模式起名為index
這樣:
在模板里面可以這樣引用:
{% url 'home' %} #模板渲染的時候,被django解析成了這個名字對應的那個url,這個過程叫做反向解析
在views函數中可以這樣引用:(后面再講這個視圖函數應用反向解析的內容,上面的是模板應用反向解析的過程)
from django.urls import reverse
reverse("index", args=("2018", ))
例子:
考慮下面的URLconf:
from django.conf.urls import url
from . import views
urlpatterns = [
# ...
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
# ...
]
根據這里的設計,某一年nnnn對應的歸檔的URL是/articles/nnnn/。
你可以在模板的代碼中使用下面的方法獲得它們:
<a href="{% url 'news-year-archive' 2012 %}">2012 Archive</a>
<ul>
{% for yearvar in year_list %}
<li><a href="{% url 'news-year-archive' yearvar %}">{{ yearvar }} Archive</a></li>
{% endfor %}
</ul>
在Python 代碼中,這樣使用:
from django.urls import reverse
from django.shortcuts import redirect
def redirect_to_year(request):
# ...
year = 2006
# ...
return redirect(reverse('news-year-archive', args=(year,))) #或者直接return redirect('news-year-archive',year) redirect內部會自動調用reverse來進行反向解析
如果出於某種原因決定按年歸檔文章發布的URL應該調整一下,那么你將只需要修改URLconf 中的內容。
在某些場景中,一個視圖是通用的,所以在URL 和視圖之間存在多對一的關系。對於這些情況,當反查URL 時,只有視圖的名字還不夠。
注意:
為了完成上面例子中的URL 反查,你將需要使用命名的URL 模式。URL 的名稱使用的字符串可以包含任何你喜歡的字符。不只限制在合法的Python 名稱。
當命名你的URL 模式時,請確保使用的名稱不會與其它應用中名稱沖突。如果你的URL 模式叫做comment,而另外一個應用中也有一個同樣的名稱,當你在模板中使用這個名稱的時候不能保證將插入哪個URL。
在URL 名稱中加上一個前綴,比如應用的名稱,將減少沖突的可能。我們建議使用myapp-comment 而不是comment。
今日內容
1.urlconf
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^blog/$', views.blog),
url(r'^blog/[0-9]{4}/$', views.blogs),
]
2.正則表達式
^ $ [0-9] [a-zA-Z] \d \w . * + ?
3.分組和命名分組
分組
url(r'^blog/([0-9]{4})/$', views.blogs), —— 》 分組 將捕獲的參數按位置傳參傳遞給視圖函數
命名分組
url(r'^blog/(?P<year>[0-9]{4})/$', views.blogs), —— 》 命名分組 將捕獲的參數按關鍵字傳參傳遞給視圖函數
4.include
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls')),
]
app01.urls
from django.conf.urls import url
from . import views
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^blog/$', views.blog),
url(r'^blog/(?P<year>[0-9]{4})/(?P<month>\d{2})/$', views.blogs),
]
5.URL的命名和反向解析
靜態路由
url(r'^blog/$', views.blog, name='blog'),
反向解析
模板
{% url 'blog' %} _> /blog/
py文件中
from django.urls import reverse
reverse('blog') _> '/blog/'
分組
url(r'^blog/([0-9]{4})/(\d{2})/$', views.blogs, name='blogs'),
反向解析
模板
{% url 'blogs' 2222 12 %}" ——》 /blog/2222/12/
py文件中
from django.urls import reverse
reverse('blogs',args=('2019','06')) ——》 /app01/blog/2019/06/
命名分組
url(r'^blog/([0-9]{4})/(\d{2})/$', views.blogs, name='blogs'),
反向解析
模板
{% url 'blogs' 2222 12 %}" ——》 /blog/2222/12/
{% url 'blogs' year=2222 month=12 %}" ——》 /blog/2222/12/
py文件中
from django.urls import reverse
reverse('blogs',args=('2019','06')) ——》 /app01/blog/2019/06/
reverse('blogs',kwargs={'year':'2019','month':'06'}) ——》 /app01/blog/2019/06/
6.namespace
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02')),
]
{% url 'app01:blogs' 2222 12 %}
reverse('app01:blogs',args=('2019','06'))

