zoukankan      html  css  js  c++  java
  • Django 高级视图和url配置

    URL配置技巧:

    方法一:

     1 from django.conf.urls.defaults import *
     2 from mysite.views import current_datetime, hours_ahead, hours_behind, now_in_chicago, now_in_london
     3 
     4 urlpatterns = patterns('',
     5     ('time/', current_datetime),
     6     ('time/plus/(d{1,2})/', hours_ahead),
     7     ('time/minus/(d{1,2})/', hours_behind),
     8     ('time/in_chicago/', now_in_chicago),
     9     ('time/in_london/', now_in_london),
    10 )

    方法二:

     1 from django.conf.urls.defaults import *
     2 from mysite import views
     3 
     4 urlpatterns = patterns('',
     5     ('time/', views.current_datetime),
     6     ('time/plus/(d{1,2})/', views.hours_ahead),
     7     ('time/minus/(d{1,2})/', views.hours_behind),
     8     ('time/in_chicago/', views.now_in_chicago),
     9     ('time/in_london/', views.now_in_london),
    10 )

    方法三:

    from django.conf.urls.defaults import *
    
    urlpatterns = patterns('website.views',
        ('time/', 'website.views.current_datetime'),
        ('time/plus/(d{1,2})/', 'website.views.hours_ahead'),
        ('time/minus/(d{1,2})/', 'website.views.hours_behind'),
        ('time/in_chicago/', 'website.views.now_in_chicago'),
        ('time/in_london/', 'website.views.now_in_london'),
    )

    方法一的url配置和方法二和方法三的url配置结果是一样的,上面的配置的缺点是如果是导入多个函数,就要在代码前面一直导入,比较繁琐,
    下面的采用的是字符串技术,只要在url配置里面加一个参数,这样就不需要在前面导入,还有一点注意此处参数两边引号,这边django会自动处理字符串

    使用多个视图前缀:

    在实践中,如果你使用字符串技术,特别是当你的 URLconf 中没有一个公共前缀时,你最终可能混合视图。然而,你仍然可以利用视图前缀的简便方式来减少重复。只要增加多个 patterns() 对象,象这样:(下面两边部分的代码均是基于Django1.1)

    旧的:

    1 from django.conf.urls.defaults import *
    2 
    3 urlpatterns = patterns('',
    4     (r'^/?$', 'mysite.views.archive_index'),
    5     (r'^(d{4})/([a-z]{3})/$', 'mysite.views.archive_month'),
    6     (r'^tag/(w+)/$', 'weblog.views.tag'),
    7 )

    新的:

     1 from django.conf.urls.defaults import *
     2 
     3 urlpatterns = patterns('mysite.views',
     4     (r'^/?$', 'archive_index'),
     5     (r'^(d{4})/([a-z]{3})/$', 'archive_month'),
     6 )
     7 
     8 urlpatterns += patterns('weblog.views',
     9     (r'^tag/(w+)/$', 'tag'),
    10 )

    整个框架关注的是存在一个名为 urlpatterns 的模块级别的变量。这个变量可以动态构建,正如本例中我们所做的一样。

    创建一个通用视图:

     1 # urls.py
     2 
     3 from django.conf.urls.defaults import *
     4 from mysite import views
     5 
     6 urlpatterns = patterns('',
     7     (r'^events/$', views.event_list),
     8     (r'^blog/entries/$', views.entry_list),
     9 )
    10 
    11 # views.py
    12 
    13 from django.shortcuts import render_to_response
    14 from mysite.models import Event, BlogEntry
    15 
    16 def event_list(request):
    17     obj_list = Event.objects.all()
    18     return render_to_response('mysite/event_list.html', {'event_list': obj_list})
    19 
    20 def entry_list(request):
    21     obj_list = BlogEntry.objects.all()
    22     return render_to_response('mysite/blogentry_list.html', {'entry_list': obj_list})

    这两个视图做的事情实质上是一样的:显示一系列的对象。让我们把它们显示的对象的类型抽象出来:

     1 # urls.py
     2 
     3 from django.conf.urls.defaults import *
     4 from mysite import models, views
     5 
     6 urlpatterns = patterns('',
     7     (r'^events/$', views.object_list, {'model': models.Event}),
     8     (r'^blog/entries/$', views.object_list, {'model': models.BlogEntry}),
     9 )
    10 
    11 # views.py
    12 
    13 from django.shortcuts import render_to_response
    14 
    15 def object_list(request, model):
    16     obj_list = model.objects.all()
    17     template_name = 'mysite/%s_list.html' % model.__name__.lower()
    18     return render_to_response(template_name, {'object_list': obj_list})
    • 我们通过 model 参数直接传递了模型类。额外URLconf参数的字典是可以传递任何类型的对象,而不仅仅只是字符串。

    • 这一行: model.objects.all() 是 鸭子界定 (原文:duck typing,是计算机科学中一种动态类型判断的概念)的一个例子:如果一只鸟走起来像鸭子,叫起来像鸭子,那我们就可以把它当作是鸭子了。需要注意的是代码并不知道 model 对象的类型是什么;它只要求 model 有一个 objects 属性,而这个属性有一个 all() 方法

    • 我们使用 model.__name__.lower() 来决定模板的名字。每个Python的类都有一个 __name__ 属性返回类名。这特性在当我们直到运行时刻才知道对象类型的这种情况下很有用。比如, BlogEntry 类的 __name__ 就是字符串 'BlogEntry' 。

    • 这个例子与前面的例子稍有不同,我们传递了一个通用的变量名给模板。当然我们可以轻易的把这个变量名改成 blogentry_list 或者 event_list ,不过我们打算把这当作练习留给读者。

    本人目前在学习python、前端、数据库和linux相关的内容,故打算写一些学习笔记,包括安装软件遇到的一些问题、编程语言的学习。 学习如逆水行舟,你在原地踏步的同时,别人一直在前进!
  • 相关阅读:
    一个晚上加一个上午啊 笨死算球
    转来的——python webdriver自动化测试初步印象——转来的
    MySQL软件升级
    创建rhel7基础镜像
    SHELL-收集Oracle已应用的PSU信息
    rhel7.6上安装Oracle 19.2.0.0 RAC
    AIX平台安装Oracle11gR2数据库
    Oracle Database(rdbms) 12.2 安装组件
    HP-UX平台安装Oracle11gR2数据库
    Linux平台安装Oracle11gR2数据库
  • 原文地址:https://www.cnblogs.com/souhaite/p/10818336.html
Copyright © 2011-2022 走看看