您的位置:首页 > 编程语言 > Go语言

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 的报错。!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: