URL的反向解析


簡單來說就是可以給我們的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'))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM