4.django-url

url

url(regex, view, kwargs=None, name=None)
  • regex:一个正则表达式字符串
  • view:对应视图函数
  • kwargs:可选的要传递给视图函数的默认参数(字典形式)
  • name:一个可选的name参数

1.一些简单的url

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
  • 如果想从URL中获取一个值,只需要在它周围加上一对圆括号。
  • 每个URL都不需要添加一个前导的反斜杠。例如,应该是^articles 而不是 ^/articles。
  • 每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python这个字符串是“原始的” —— 字符串中任何字符都不应该转义。

一些请求的例子:

  • /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数views.month_archive(request, '2005', '03')。
  • /articles/2005/3/ 不匹配任何URL模式,因为列表中的第三个模式要求月份应该是两个数字。
  • /articles/2003/ 将匹配列表中的第一个模式不是第二个,因为模式按顺序匹配,匹配第一个成功就结束匹配了。
  • /articles/2003 不匹配任何一个模式,因为每个模式要求URL以一个斜线结尾。
  • /articles/2003/03/03/ 将匹配最后一个模式。Django 将调用函数views.article_detail(request, '2003', '03', '03')。

2.命名组

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2})/$', views.article_detail),
]
  • /articles/2005/03/ 请求将调用views.montharchive(request, year='2005', month='03')函数,而不是views.montharchive(request, '2005', '03')。
  • /articles/2003/03/03/ 请求将调用函数views.article_detail(request, year='2003', month='03', day='03')。

3.传递额外的参数给视图函数

django.conf.urls.url() 函数可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键字参数。

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^blog/(?P<year>[0-9]{4})/$', views.year_archive, {'foo': 'bar'}),
]

对于/blog/2005/请求,Django 将调用views.year_archive(request, year='2005', foo='bar')。

处理冲突

URL模式捕获的命名关键字参数和在字典中传递的额外参数有可能具有相同的名称。当这种情况发生时,将使用字典中的参数而不是URL中捕获的参数。

4.包含其它的URLconfs

from django.conf.urls import include, url

urlpatterns = [
    url(r'^community/', include('django_website.aggregator.urls')),
    url(r'^contact/', include('django_website.contact.urls')),
]

5.用url的name参数来反向解析url

urlpatterns = [
	url(r'^old_articles/(?P<year>[0-9]{4})/$', views.old_year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive,name='articles'),
]

在views中

from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse

def old_year_archive(request, year):
	
	return HttpResponseRedirect(
		reverse('articles', args=(year,))
	)

在templates中

# 格式 {% url 'name' 参数 %}
<a href="{% url 'article' 2017 %}">link</a>

上面代码经过渲染后

<a href="/articles/2017/">link</a>
posted @ 2017-08-17 23:50  ret  阅读(66)  评论(0)    收藏  举报