django-url常见用法
2017-02-25 19:52
239 查看
django URL 捕获的永远是字符串
1.参数的传递
①单纯正则表达式,调用函数
from django.conf.url import url
from . inport 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)
]
②传递参数,调用函数
from django.conf.url 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.month_archive(request, year='2005', month='03')函数
/articles/2003/03/03/ 请求将调用函数views.article_detail(request, year='2003', month='03', day='03')
③有命名的参数,就使用这些命名的参数,对于没有命名的参数,则会忽略
url(r'add/(\d+)/(?P<num1>\d)/(>P<num2>\d+)/',add,name='add')
def add(request,num1,num2):
num1=int(num1)
num2=int(num2)
return HttpResponse(num1+num2)
####当访问http://127.0.0.1:8000/add/666/321/123/时####
####得到的结果是444#####
④不同url,使用同一函数
from django.conf.urls import url
from . import views
urlpatterns=[
url(r'^blog/$',views.page),
url(r'^blog/page(?P<num>[0-9]+)/$',views.page),
]
def page(request,num="1"):
###两个url指向同一视图,但是第一种不会捕获任何值。第一种匹配时,page()使用num参数的默认值“1”###
###第二种模式匹配,page()使用正则表达式捕获num值###
⑤去除url冗余
冗余部分:
from django.conf.urls import urlfrom . import views
urlpatterns = [
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/history/$', views.history),
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/edit/$', views.edit),
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/discuss/$', views.discuss),
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/permissions/$', views.permissions),
]
简化部分:
from django.conf.urls import include, urlfrom . import views
urlpatterns = [
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/', include([
url(r'^history/$', views.history),
url(r'^edit/$', views.edit),
url(r'^discuss/$', views.discuss),
url(r'^permissions/$', views.permissions),
])),
]
⑥参数向下传递
# In settings/urls/main.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^(?P<username>\w+)/blog/', include('foo.urls.blog')),
]
# In foo/urls/blog.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.blog.index),
url(r'^archive/$', views.blog.archive),
]
###捕获的username变量将被传递给include指向的URLconf
⑦嵌套的参数:原则,不需要的参数尽量不去捕获
from django.conf.urls import url
urlpatterns = [
url(r'blog/(page-(\d+)/)?$', blog_articles), # bad
url(r'comments/(?:page-(?P<page_number>\d+)/)?$', comments), # good
]
###当blog/page-2/时,将匹配blog_articles并带有两个参数,page-1/和2(凡是分组都会传递参数,顺序由内到外)
###而(?:...)只会匹配内层参数,外围的参数不会捕获
###comments/page-2/时,会传递一个值为2的page_number的参数
⑧传递额外的选项给视图函数
url内可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键参数
from django.conf.urls import urlfrom . 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中捕获的参数
###也就是说字典中的参数优先级更高###
⑨URL的反向解析
反向解析,就是在模板中,或 views 函数中进行 url 的获取或者重定向到指定页面的时候,可以更加灵活的写入目标 url 而不用硬编码
###而为了解决命名重复的问题,又引入了命名空间###
from django.conf.urls import url
from . import views
urlpatterns = [
#...
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
#...]
###在这里,添加了 name 这个属性,并将其赋值为'news-year-archive'。这就是为这个 url 进行了命名。###
###在进行命名了以后,就可以这样写###
<a href="{% url ‘new-year-archive’}>测试</a> #模板中
from django.core.urlresolvers import reverse
def xxx(request): #视图函数
......
return HttpResponseRedirect(reverse('news-year-archive',))
###这里的reverse()函数的作用是进行反向解析,以直接访问其他视图函数###
###reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None) ###
###若没有找到匹配的对象,则抛出 NoReverseMatch 异常。###
⑩通过命名空间来反向解析,解决不同应用下,相同url的情况
from django.conf.urls import include, url
urlpatterns = [
url(r'^author-polls/', include('polls.urls', namespace='author-polls', app_name='polls')),
]
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),
...
]
###使用方法###
在模板中
{% url 'polls:index' %}
在视图方法中,在模板中的反查需要添加 request 的 current_app 属性
reverse('polls:index', current_app=self.request.resolver_match.namespace)
模板
1.8以前只支持django模板DTL,1.8之后还支持jinja2模板
jinja2的配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
'/home/html/example.com',
'/home/html/default',
],
},
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [
'/home/html/jinja2',
],
},
]
渲染
render和render_to_response作用相同,只是render多了一个request参数
eg:
from django.shortcuts import render
def my_view(request):
# View code here...
return render(request, 'myapp/index.html', {"foo": "bar"},
content_type="application/xhtml+xml")
###等效于###
from django.http import HttpResponse
from django.template import RequestContext, loader
def my_view(request):
# View code here...
t = loader.get_template('myapp/index.html')
c = RequestContext(request, {'foo': 'bar'})
return HttpResponse(t.render(c),
content_type="application/xhtml+xml")
eg2:
from django.shortcuts import render_to_response
def my_view(request):
# View code here...
return render_to_response('myapp/index.html', {"foo": "bar"},
content_type="application/xhtml+xml")
###等效于###
from django.http import HttpResponse
from django.template import Context, loader
def my_view(request):
# View code here...
t = loader.get_template('myapp/index.html')
c = Context({'foo': 'bar'})
return HttpResponse(t.render(c),
content_type="application/xhtml+xml")
!!!!!当开启了 CSRF 中间件后,并处理 POST 的表单时,请使用 render 函数,而不是 render_to_response,只有 render 函数会处理 csrf token,否则你可能会面对 csrf 的报错。!!!!!
1.参数的传递
①单纯正则表达式,调用函数
from django.conf.url import url
from . inport 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)
]
②传递参数,调用函数
from django.conf.url 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.month_archive(request, year='2005', month='03')函数
/articles/2003/03/03/ 请求将调用函数views.article_detail(request, year='2003', month='03', day='03')
③有命名的参数,就使用这些命名的参数,对于没有命名的参数,则会忽略
url(r'add/(\d+)/(?P<num1>\d)/(>P<num2>\d+)/',add,name='add')
def add(request,num1,num2):
num1=int(num1)
num2=int(num2)
return HttpResponse(num1+num2)
####当访问http://127.0.0.1:8000/add/666/321/123/时####
####得到的结果是444#####
④不同url,使用同一函数
from django.conf.urls import url
from . import views
urlpatterns=[
url(r'^blog/$',views.page),
url(r'^blog/page(?P<num>[0-9]+)/$',views.page),
]
def page(request,num="1"):
###两个url指向同一视图,但是第一种不会捕获任何值。第一种匹配时,page()使用num参数的默认值“1”###
###第二种模式匹配,page()使用正则表达式捕获num值###
⑤去除url冗余
冗余部分:
from django.conf.urls import urlfrom . import views
urlpatterns = [
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/history/$', views.history),
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/edit/$', views.edit),
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/discuss/$', views.discuss),
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/permissions/$', views.permissions),
]
简化部分:
from django.conf.urls import include, urlfrom . import views
urlpatterns = [
url(r'^(?P<page_slug>[\w-]+)-(?P<page_id>\w+)/', include([
url(r'^history/$', views.history),
url(r'^edit/$', views.edit),
url(r'^discuss/$', views.discuss),
url(r'^permissions/$', views.permissions),
])),
]
⑥参数向下传递
# In settings/urls/main.py
from django.conf.urls import include, url
urlpatterns = [
url(r'^(?P<username>\w+)/blog/', include('foo.urls.blog')),
]
# In foo/urls/blog.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.blog.index),
url(r'^archive/$', views.blog.archive),
]
###捕获的username变量将被传递给include指向的URLconf
⑦嵌套的参数:原则,不需要的参数尽量不去捕获
from django.conf.urls import url
urlpatterns = [
url(r'blog/(page-(\d+)/)?$', blog_articles), # bad
url(r'comments/(?:page-(?P<page_number>\d+)/)?$', comments), # good
]
###当blog/page-2/时,将匹配blog_articles并带有两个参数,page-1/和2(凡是分组都会传递参数,顺序由内到外)
###而(?:...)只会匹配内层参数,外围的参数不会捕获
###comments/page-2/时,会传递一个值为2的page_number的参数
⑧传递额外的选项给视图函数
url内可以接收一个可选的第三个参数,它是一个字典,表示想要传递给视图函数的额外关键参数
from django.conf.urls import urlfrom . 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中捕获的参数
###也就是说字典中的参数优先级更高###
⑨URL的反向解析
反向解析,就是在模板中,或 views 函数中进行 url 的获取或者重定向到指定页面的时候,可以更加灵活的写入目标 url 而不用硬编码
###而为了解决命名重复的问题,又引入了命名空间###
from django.conf.urls import url
from . import views
urlpatterns = [
#...
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),
#...]
###在这里,添加了 name 这个属性,并将其赋值为'news-year-archive'。这就是为这个 url 进行了命名。###
###在进行命名了以后,就可以这样写###
<a href="{% url ‘new-year-archive’}>测试</a> #模板中
from django.core.urlresolvers import reverse
def xxx(request): #视图函数
......
return HttpResponseRedirect(reverse('news-year-archive',))
###这里的reverse()函数的作用是进行反向解析,以直接访问其他视图函数###
###reverse(viewname, urlconf=None, args=None, kwargs=None, current_app=None) ###
###若没有找到匹配的对象,则抛出 NoReverseMatch 异常。###
⑩通过命名空间来反向解析,解决不同应用下,相同url的情况
from django.conf.urls import include, url
urlpatterns = [
url(r'^author-polls/', include('polls.urls', namespace='author-polls', app_name='polls')),
]
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.IndexView.as_view(), name='index'),
url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'),
...
]
###使用方法###
在模板中
{% url 'polls:index' %}
在视图方法中,在模板中的反查需要添加 request 的 current_app 属性
reverse('polls:index', current_app=self.request.resolver_match.namespace)
模板
1.8以前只支持django模板DTL,1.8之后还支持jinja2模板
jinja2的配置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
'/home/html/example.com',
'/home/html/default',
],
},
{
'BACKEND': 'django.template.backends.jinja2.Jinja2',
'DIRS': [
'/home/html/jinja2',
],
},
]
渲染
render和render_to_response作用相同,只是render多了一个request参数
eg:
from django.shortcuts import render
def my_view(request):
# View code here...
return render(request, 'myapp/index.html', {"foo": "bar"},
content_type="application/xhtml+xml")
###等效于###
from django.http import HttpResponse
from django.template import RequestContext, loader
def my_view(request):
# View code here...
t = loader.get_template('myapp/index.html')
c = RequestContext(request, {'foo': 'bar'})
return HttpResponse(t.render(c),
content_type="application/xhtml+xml")
eg2:
from django.shortcuts import render_to_response
def my_view(request):
# View code here...
return render_to_response('myapp/index.html', {"foo": "bar"},
content_type="application/xhtml+xml")
###等效于###
from django.http import HttpResponse
from django.template import Context, loader
def my_view(request):
# View code here...
t = loader.get_template('myapp/index.html')
c = Context({'foo': 'bar'})
return HttpResponse(t.render(c),
content_type="application/xhtml+xml")
!!!!!当开启了 CSRF 中间件后,并处理 POST 的表单时,请使用 render 函数,而不是 render_to_response,只有 render 函数会处理 csrf token,否则你可能会面对 csrf 的报错。!!!!!
相关文章推荐
- Django get_absolute_url 用法
- django的url()用法总结
- URL 重写的常见用法
- Django的url用法简单介绍
- python3开发进阶-Django视图(View)的常见用法
- 基于Django URL传参 FORM表单传数据 get post的用法实例
- Django中关于url的用法
- Django之URL(路由系统)用法
- Django中URL的相关配置以及后台函数常见设置(Django系列6)
- django入门笔记3- URL关键用法
- C# Request获取URL常见用法
- ORACLE表连接方式分析及常见用法
- 常见Oracle HINT的用法
- DataGridView常见用法和FAQ汇总
- 嵌入式中指针几个简单却常见的用法
- Django 中接收 URL 中的中文参数
- const 用法及常见错误
- JTable常见用法细则
- 常见ant命令及其用法
- 常见URL字符及URL编码值