django_url视图

基础


django.cof.url.defaults


django.cof.url.defaults.patterns()

urlpatterns = patterns('',
    # Example:
    # (r'^mysite/', include('mysite.foo.urls')),

    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
    # to INSTALLED_APPS to enable admin documentation:
    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),

    # Uncomment the next line to enable the admin:
    # (r'^admin/', include(admin.site.urls)),
)

在这个函数中添加元组映射:正则表达式->视图函数

在正则表达式中,’^admin/’将会和以admin为开头的url匹配,如/admin/user/

‘admin/$’将会和以admin为结尾的url匹配,如/01/lal/admin/

为根目录实现视图:只需要添加正则表达式‘^$’对应的视图函数就可以进行根目录的匹配

django.cof.url.defaults.include()

include(arg, namespace=None, app_name=None):

arg是url.py的位置字符串,指定的该url文件位置可以在所在文件配置patterns,实现松散耦合。

namespace给url定义命名空间

Django处理视图

当运行python manage.py runserver时,脚本将在于manage.py的同目录下寻找setting.py文件,以寻找配置信息:

Django处理视图的过程

ROOT_URLCONF这个配置最为重要,它将作为URLconf告诉Django在这个站点中那些Python的模块将被用到

ROOT_URLCONF = 'mysite.urls'

这个配置指向mysite/url.py文件,这是视图配置的文件

ROOT_URLCONF配置URLconf,并且在URLpatterns中进行匹配url所映射的view函数并调用,且把HttpRequest对象作为第一个参数传入函数中

视图函数返回一个HttpResponse

Django转换HttpResponse为一个适合的HTTP response, 以Web page显示出来

view函数的传参

默认情况下,view的第一个参数是HttpRequest对象。但是对于URLpatterns中url正则表达式的强大应用,如果匹配到了不确定性的内容,就需要我们向view中传参进行处理。如:

from django.conf.urls.defaults import *
from mysite.views import hello, current_datetime, hours_ahead

urlpatterns = patterns('',
    (r'^hello/$', hello),
    (r'^time/$', current_datetime),
    (r'^time/plus/(\d{1,2})/$', hours_ahead),
)

对于(\d{1,2})的匹配,可能会有1-2位的整数出现,对于这种不确定的情况,我们想要对不同的值获取不同的结果,当然要在视图(view)中设置参数传入。

from django.http import Http404, HttpResponse
import datetime

def hours_ahead(request, offset):
    try:
        offset = int(offset)
    except ValueError:
        raise Http404()
    dt = datetime.datetime.now() + datetime.timedelta(hours=offset)
    html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt)
    return HttpResponse(html)

offset 是从匹配的URL里提取出来的。 例如:如果请求URL是/time/plus/3/,那么offset将会是3;如果请求URL是/time/plus/21/,那么offset将会是21。请注意:捕获值永远都是字符串(string)类型,而不会是整数(integer)类型,即使这个字符串全由数字构成(如:“21”)。

offset的位置很重要,它一定是view函数的第二个参数

其中有一个非常重要也是老练的做法,就是传参进来之后,先要将参数进行类型转换(类型设定),比如offset需要int()一下,否则默认是str类型的

还有一个地方,就是如果出现异常抛出了Http404


高级

URLconf

使用命名组

urlpatterns = patterns('', 
    (r'^articles/(?P<year>\d{4})/$', views.year_archive),
    (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 
    views.month_archive), 
)

修改前代码

urlpatterns = patterns('',
    (r'^articles/(\d{4})/$', views.year_archiv),
    (r'^articles/(\d{4})/(\d{2})/$',views.month_archive),
)

那修改后调用函数:

month_archive(request, year='2006', month='03')

当然这只是一种做法,它使得代码变得可读性更高,但是它在某些人严重就出现了冗余代码

传递额外的参数到视图函数中

URLconf里面的每一个模式都可以包含第三个数据: 一个关
键字参数的字典:

urlpatterns = patterns('', 
    (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}), 
    (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}), 
)

而在views.py中

def foobar_view(request, template_name): 
    m_list = MyModel.objects.filter(is_new=True) 
    return render_to_response(template_name, {'m_list': m_list})

抽象出模型,创建一个可复用,与模型无关的视图

# urls.py
from django.conf.urls.defaults import * 
from mysite import models, views
urlpatterns = patterns('', 
    (r'^events/$', views.object_list, {'model': models.Event}), 
    (r'^blog/entries/$', views.object_list, {'model': models.BlogEntry}), 
)

# views.py
from django.shortcuts import render_to_response
def object_list(request, model): 
    obj_list = model.objects.all() 
    template_name = 'mysite/%s_list.html' % model.__name__.lower() 
    return render_to_response(template_name, {'object_list': obj_list})

使用 model.__name__.lower() 来决定模板的名字。 每个Python 的类都有一个 __name__ 属性返
回类名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值