标题:我的Django学习笔记(最后更新2008-05-22) 出处:运维进行时 时间:Thu, 22 May 2008 16:13:00 +0000 作者:root 地址:https://blog.liuts.com/post/94/ 内容: 〖高级视图和URL配置〗 ============================================================================ 一、流线型化(Streamlining)函数导入 方式1: from django.conf.urls.defaults import * from mysite.views import current_datetime,hours_ahead urlpatterns = patterns('', (r'^now/$', current_datetime), (r'^now/plus(\d{1,2})hours/$', hours_ahead), ) 方式2: from django.conf.urls.defaults import * from mysite import views urlpatterns = patterns('', (r'^now/$', views.current_datetime), (r'^now/plus(\d{1,2})hours/$', views.hours_ahead), ) 方式3: from django.conf.urls.defaults import * urlpatterns = patterns('mysite.views', (r'^/?$', 'archive_index'), (r'^(\d{4})/([a-z]{3})/$', 'archive_month'), ) urlpatterns += patterns('weblog.views', (r'^tag/(\w+)/$', 'tag'), ) 二、使用命名组 无组命名: from django.conf.urls.defaults import * from mysite import views urlpatterns = patterns('', (r'^articles/(\d{4})/$', views.year_archive), (r'^articles/(\d{4})/(\d{2})/$', views.month_archive), ) 有组命名: from django.conf.urls.defaults import * from mysite import views urlpatterns = patterns('', (r'^articles/(?P\d{4})/$', views.year_archive), (r'^articles/(?P\d{4})/(?P\d{2})/$', views.month_archive), ) 例如,如果不带命名组,请求 /articles/2006/03/ 将会等于这样的函数调用: month_archive(request, '2006', '03') 而带命名组,同样的请求就是这样的函数调用: month_archive(request, year='2006', month='03') 三、匹配/组合算法 from django.conf.urls.defaults import * from mysite import views urlpatterns = patterns('', (r'^foo/$', views.foobar_view, {'template_name': 'template1.html'}), (r'^bar/$', views.foobar_view, {'template_name': 'template2.html'}), ) # views.py from django.shortcuts import render_to_response from mysite.models import MyModel def foobar_view(request, template_name): m_list = MyModel.objects.filter(is_new=True) return render_to_response(template_name, {'m_list': m_list}) 四、伪造捕捉到的URLconf值 urlpatterns = patterns('', (r'^mydata/birthday/$', views.my_view, {'month': 'jan', 'day': '06'}), (r'^mydata/(?P\w{3})/(?P\d\d)/$', views.my_view), ) def my_view(request, month, day): # .... 五、通用视图 原视图: from django.conf.urls.defaults import * from mysite import views urlpatterns = patterns('', (r'^events/$', views.event_list), (r'^blog/entries/$', views.entry_list), ) # views.py from django.shortcuts import render_to_response from mysite.models import Event, BlogEntry def event_list(request): obj_list = Event.objects.all() return render_to_response('mysite/event_list.html', {'event_list': obj_list}) def entry_list(request): obj_list = BlogEntry.objects.all() return render_to_response('mysite/blogentry_list.html', {'entry_list': obj_list}) 通用视图: 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}) URLconf可以带model类型的参数。 六、提供视图配置选项 一个应用中比较常见的可供配置代码是模板名字: def my_view(request, template_name): var = do_something() return render_to_response(template_name, {'var': var}) 捕捉值和额外参数之间的优先级: from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^mydata/(?P\d+)/$', views.my_view, {'id': 3}), ) (比如, /mydata/2/ 或者 /mydata/432432/ )都会作 id 设置为 3 对待,不管URL里面能捕捉到什么样的值。 七、缺省视图参数 from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^blog/$', views.page), (r'^blog/page(?P\d+)/$', views.page), ) # views.py def page(request, num="1"): # Output the appropriate page of blog entries, according to num. # ... 八、特殊情况下的视图 urlpatterns = patterns('', # ... ('^auth/user/add/$', 'django.contrib.admin.views.auth.user_add_stage'), ('^([^/]+)/([^/]+)/add/$', 'django.contrib.admin.views.main.add_stage'), # ... ) 我们要利用URLconf从顶向下的解析顺序这个特点。象 /auth/user/add/ 的请求将会被 user_add_stage 视图处理。尽管URL也匹配第二种模式,它会先匹配上面的模式。(这是短路逻辑。) 九、从URL中捕获文本的注意点 每个被捕获的参数将被作为纯Python字符串来发送,而不管正则表达式中的格式。举个例子,在这行URLConf中: (r'^articles/(?P\d{4})/$', views.year_archive), 参数 year 是作为string传至 views.year_archive() ,而非integer,即使 \d{4} 将只匹配整数的字符串。 当你在写视图代码时记住这点很重要,许多Python内建的方法对于接受的对象的类型很讲究。很常见的错误时用字符串值而不是整数值来创建datetime.date对象: 错误: def day_archive(request, year, month, day) # The following statement raises a TypeError! date = datetime.date(year, month, day) 正确: def day_archive(request, year, month, day) date = datetime.date(int(year), int(month), int(day)) 十、包含(include)其他URLconf from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^weblog/', include('mysite.blog.urls')), (r'^photos/', include('mysite.photos.urls')), (r'^about/$', 'mysite.views.about'), ) --------------------------------- mysite.blog.urls from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^(\d\d\d\d)/$', 'mysite.blog.views.year_detail'), (r'^(\d\d\d\d)/(\d\d)/$', 'mysite.blog.views.month_detail'), ) */weblog/2007/ :在第一个URLconf中,模式 r'^weblog/' 被匹配。因为它是一个 include() ,Django将截掉所有匹配的文本,在这里是 'weblog/' 。URL剩余的部分是 2007/\ , 将在 mysite.blog.urls ·这个URLconf的第一行中被匹配。 */weblog//2007/ :在第一个URLconf中,模式 r'^weblog/' 被匹配。因为它是一个 include() ,Django将截掉所有匹配的文本,在这里是 'weblog/' 。URL剩余的部分是 /2007/ (开头有一个斜杠),将不会匹配``mysite.blog.urls`` 中的任何URLconf。 */about/ : 这个匹配第一个URLconf中的``mysite.views.about``view。只是为了示范你可以混合``include()`` patterns和 non-include() patterns在一起使用。 十一、捕获的参数如何让和 include()协同工作 # root urls.py from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^(?P\w+)/blog/', include('foo.urls.blog')), ) # foo/urls/blog.py from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^$', 'foo.views.blog_index'), (r'^archive/$', 'foo.views.blog_archive'), ) 在这个例子中,被捕获的”username”变量将传递给被included 的 URLconf,因此,在那个被included 的 URLconf中的每一个view函数都将获得那个参数。 十二、额外的URLconf如何和include()协同工作 下面的两个URLconf在功能上是相等的。 第一个: # urls.py from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^blog/', include('inner'), {'blogid': 3}), ) # inner.py from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^archive/$', 'mysite.views.archive'), (r'^about/$', 'mysite.views.about'), (r'^rss/$', 'mysite.views.rss'), ) 第二个 # urls.py from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^blog/', include('inner')), ) # inner.py from django.conf.urls.defaults import * urlpatterns = patterns('', (r'^archive/$', 'mysite.views.archive', {'blogid': 3}), (r'^about/$', 'mysite.views.about', {'blogid': 3}), (r'^rss/$', 'mysite.views.rss', {'blogid': 3}), ) Generated by Bo-blog 2.1.1 Release