Django视图层(URL)

Django视图层主要工作就是衔接HTTP请求、python程序、HTML模板。

URL分发(URL dispatcher)映射配置可以被看作Django项目的入口配置(项目下的urls.py以及应用的下的urls.py,include将两者联系起来在项目下的urls.py),通过URLdispatcher可以指定用户的每一个访问的后台的python处理函数是什么。

1.普通url映射

每一个Django都有一个urls.py来维护URL dispatcher,如下所示:

from django.conf.urls import url

from . import views  #导入视图处理函数

urlpatterns = [
    url(r'^year/2015/$', views.moments_2015),
    url(r'^year/([0-9]{4}$)', views.years_moments),
    url(r'^month/([0-9]{4})/([0-9]{2}$)', views.month_moments),
    url(r'month/([0-9]{4})/([0-9]{2})/([0-9]+)$', views.test),
]

该文件通过维护urlpatterns列表的元素完成URL映射,每个元素都是django.conf.urls.url的一个实例,url的第一个参数是HTPP路径,第二个是相应的python函数名。

                                                                         

URL路径用正则表达式表达,'^'起始符,'$'结束符,第一个路径是严格路径,只匹配'year/2015',调用是的views中moment_2015(request)函数,request是用户请求对象!

第二个路径匹配的事任何'year/xxxx'路径,其中xxxx代表是四个数字,调用views的year_moment(request,xxxx),并且会把四个数字当成变量传给该函数

第三个第四个与第二个类似,只不过后续添加了更多路径变量调用函数分别为month_moments(request, xxxx, yy)和test(request,xxxx, yy, zz)

   2.命名URL参数映射

命名URL参数映射使得开发者可以定义这些被传递参数的参数名称,方式为"?P<name>pattern",如下所示:

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

urlpatterns = [
    url(r'^year/2015/$', views.moments_2015),
    url(r'^year/?P<year>([0-9]{4}$)', views.years_moments),
    url(r'^month/?P<year>([0-9]{4})/?P<month>([0-9]{2}$)', views.month_moments),
]

当多个URL映射定义可以匹配同一个URL访问,django会选取列表的第一个元素!!!!!!!!!!

后两个url使用命名参数进行定义,调用函数如下:

year_moments(request,year=xxxx)和month_moments(request,year=xxxx,month=xx)!

3.分布式URL映射

在django项目中,可能包含多个应用,每个app都有自己urls.py,如果将所有的url映射都放在一个urls.py文件不利于维护。Django通过include()函数提供了分布式URL映射功能。

在项目根映射文件urls.py引用其他应用的映射文件:

from django.conf.urls import url, include

urlpatterns = [
    url(r'^moments/', include('djangosite.app.urls')),
    url(r'^admin/', include('djangosite.admin.urls')),
]


以moment/开头的URL被转接到djangosite.app.urls.py文件
以admin/开头的URL被转接到djangosite.admin.urls.py文件


其中子映射文件app/urls.py:

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

urlpatterns = [
    url(r'^year/?P<year>([0-9]{4})/$', views.year_moments),
    url(r'^admin/', include('djangosite.admin.urls')),
]

解析URL:
第一个对http://xxxxxxxxx/moments/year/2013的访问会定位到app/views.py的year_moments函数

第二个元素对http://xxxxxx/moments/admin的访问会转接到djangosite.admin.urls.py文件进行解析

4.反向解析

  django的反向解析共那个在模板文件和python视图函数   :

在模板文件中用{%url%}标签调用反向解析;

在python视图函数中用django.urls.reverse()函数 。

from django.conf.urls import url, include 

urlpatterns = [
    url(r'^year/2015/$', views.year_moments, name="moments_2015"),
]

   定义一个URL映射,通过name参数将该映射命名为moments_2015.在需要获取该URL的模板文件中{%url%}标签来进行声明:

<a href="{% url 'moments_2015'%}">
查看2015消息
</a>

上面用'moments_2015'映射名作为反向解析的参数,解析结果为:

<a href="/year/2015/">
查看2015消息
</a>

    在视图函数中调用方式是reverse函数。如下所示:

#views.py

from django.urls import reverse
from django.http import HTTPResponseRedirect

def redirect_to_year_2015(request):
    return HTTPResponseRedirect(reverse('moments_2015'))

                                                                                                                                         5.反向解析带参数           

  模板文件如下所示:

 

from django.conf.urls import url, include 

urlpatterns = [
    url(r'^year/?P<year>([0-9]{4})/$', views.year_moments, name="moments"),
]

   模板文件通过{%url%}标签调用反向解析:

<a href="{% url 'moments', 2015%}">
查看2015消息
</a>

上面用'moments_2015'映射名作为反向解析的参数,解析结果为:

<a href="/year/2015/">
查看2015消息
</a>

python视图函数调用reverse进行反向解析:

#views.py

from django.urls import reverse
from django.http import HTTPResponseRedirect

def redirect_to_year_2015(request):
    return HTTPResponseRedirect(reverse('moments', args=(2014,)))

args参数可以携带参数反向解析!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值