<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[运维进行时]]></title> 
<link>https://blog.liuts.com/index.php</link> 
<description><![CDATA[互联网运维与架构]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[运维进行时]]></copyright>
<item>
<link>https://blog.liuts.com/post//</link>
<title><![CDATA[我的Django学习笔记(最后更新2008-05-22)]]></title> 
<author>root &lt;admin@yourname.com&gt;</author>
<category><![CDATA[Python]]></category>
<pubDate>Thu, 22 May 2008 08:13:00 +0000</pubDate> 
<guid>https://blog.liuts.com/post//</guid> 
<description>
<![CDATA[ 
	〖高级视图和URL配置〗<br/>============================================================================<br/><strong>一、流线型化(Streamlining)函数导入</strong><br/>方式1:<br/><textarea name="code" class="python" rows="15" cols="100">
from django.conf.urls.defaults import *
from mysite.views import current_datetime,hours_ahead
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^now/$', current_datetime),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^now/plus(&#92;d&#123;1,2&#125;)hours/$', hours_ahead),
)
</textarea><br/>方式2:<br/><textarea name="code" class="python" rows="15" cols="100">
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^now/$', views.current_datetime),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^now/plus(&#92;d&#123;1,2&#125;)hours/$', views.hours_ahead),
)
</textarea><br/>方式3：<br/><textarea name="code" class="python" rows="15" cols="100">
from django.conf.urls.defaults import *
urlpatterns = patterns('mysite.views',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^/?$', 'archive_index'),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^(&#92;d&#123;4&#125;)/([a-z]&#123;3&#125;)/$', 'archive_month'),
)
urlpatterns += patterns('weblog.views',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^tag/(&#92;w+)/$', 'tag'),
)
</textarea><br/><strong>二、使用命名组</strong><br/>无组命名:<br/><textarea name="code" class="python" rows="15" cols="100">
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^articles/(&#92;d&#123;4&#125;)/$', views.year_archive),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^articles/(&#92;d&#123;4&#125;)/(&#92;d&#123;2&#125;)/$', views.month_archive),
)
</textarea><br/>有组命名：<br/><textarea name="code" class="python" rows="15" cols="100">
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^articles/(?P<year>&#92;d&#123;4&#125;)/$', views.year_archive),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^articles/(?P<year>&#92;d&#123;4&#125;)/(?P<month>&#92;d&#123;2&#125;)/$', views.month_archive),
)
</textarea><br/>例如，如果不带命名组，请求 /articles/2006/03/ 将会等于这样的函数调用：<br/>month_archive(request, '2006', '03')<br/>而带命名组，同样的请求就是这样的函数调用：<br/>month_archive(request, year='2006', month='03')<br/><br/><strong>三、匹配/组合算法</strong><br/><textarea name="code" class="python" rows="15" cols="100">
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^foo/$', views.foobar_view, &#123;'template_name': 'template1.html'&#125;),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^bar/$', views.foobar_view, &#123;'template_name': 'template2.html'&#125;),
)
# views.py
from django.shortcuts import render_to_response
from mysite.models import MyModel
def foobar_view(request, template_name):
&nbsp;&nbsp;&nbsp;&nbsp;m_list = MyModel.objects.filter(is_new=True)
&nbsp;&nbsp;&nbsp;&nbsp;return render_to_response(template_name, &#123;'m_list': m_list&#125;)
</textarea><br/><strong>四、伪造捕捉到的URLconf值</strong><br/><textarea name="code" class="python" rows="15" cols="100">
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^mydata/birthday/$', views.my_view, &#123;'month': 'jan', 'day': '06'&#125;),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^mydata/(?P&#92;w&#123;3&#125;)/(?P&#92;d&#92;d)/$', views.my_view),
)
def my_view(request, month, day):
&nbsp;&nbsp;&nbsp;&nbsp;# ....
</textarea><br/><strong>五、通用视图</strong><br/>原视图：<br/><textarea name="code" class="python" rows="15" cols="100">
from django.conf.urls.defaults import *
from mysite import views
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^events/$', views.event_list),
&nbsp;&nbsp;&nbsp;&nbsp;(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):
&nbsp;&nbsp;&nbsp;&nbsp;obj_list = Event.objects.all()
&nbsp;&nbsp;&nbsp;&nbsp;return render_to_response('mysite/event_list.html', &#123;'event_list': obj_list&#125;)

def entry_list(request):
&nbsp;&nbsp;&nbsp;&nbsp;obj_list = BlogEntry.objects.all()
&nbsp;&nbsp;&nbsp;&nbsp;return render_to_response('mysite/blogentry_list.html', &#123;'entry_list': obj_list&#125;)
</textarea><br/>通用视图：<br/><textarea name="code" class="python" rows="15" cols="100">
from django.conf.urls.defaults import *
from mysite import models, views
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^events/$', views.object_list, &#123;'model': models.Event&#125;),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^blog/entries/$', views.object_list, &#123;'model': models.BlogEntry&#125;),
)
# views.py
from django.shortcuts import render_to_response
def object_list(request, model):
&nbsp;&nbsp;&nbsp;&nbsp;obj_list = model.objects.all()
&nbsp;&nbsp;&nbsp;&nbsp;template_name = 'mysite/%s_list.html' % model.__name__.lower()
&nbsp;&nbsp;&nbsp;&nbsp;return render_to_response(template_name, &#123;'object_list': obj_list&#125;)

URLconf可以带model类型的参数。
</textarea><br/><strong>六、提供视图配置选项</strong><br/>一个应用中比较常见的可供配置代码是模板名字:<br/><textarea name="code" class="python" rows="15" cols="100">
def my_view(request, template_name):
&nbsp;&nbsp;&nbsp;&nbsp;var = do_something()
&nbsp;&nbsp;&nbsp;&nbsp;return render_to_response(template_name, &#123;'var': var&#125;)
</textarea><br/>捕捉值和额外参数之间的优先级:<br/><textarea name="code" class="python" rows="15" cols="100">
from django.conf.urls.defaults import *
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^mydata/(?P&#92;d+)/$', views.my_view, &#123;'id': 3&#125;),
)
</textarea><br/>（比如， /mydata/2/ 或者 /mydata/432432/ ）都会作 id 设置为 3 对待，不管URL里面能捕捉到什么样的值。<br/><br/><strong>七、缺省视图参数</strong><br/><textarea name="code" class="python" rows="15" cols="100">
from django.conf.urls.defaults import *
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^blog/$', views.page),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^blog/page(?P&#92;d+)/$', views.page),
)
# views.py
def page(request, num="1"):
&nbsp;&nbsp;&nbsp;&nbsp;# Output the appropriate page of blog entries, according to num.
&nbsp;&nbsp;&nbsp;&nbsp;# ...
</textarea><br/><strong>八、特殊情况下的视图</strong><br/><textarea name="code" class="python" rows="15" cols="100">
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;# ...
&nbsp;&nbsp;&nbsp;&nbsp;('^auth/user/add/$', 'django.contrib.admin.views.auth.user_add_stage'),
&nbsp;&nbsp;&nbsp;&nbsp;('^([^/]+)/([^/]+)/add/$', 'django.contrib.admin.views.main.add_stage'),
&nbsp;&nbsp;&nbsp;&nbsp;# ...
)
</textarea><br/>我们要利用URLconf从顶向下的解析顺序这个特点。象 /auth/user/add/ 的请求将会被 user_add_stage 视图处理。尽管URL也匹配第二种模式，它会先匹配上面的模式。（这是短路逻辑。）<br/><br/><strong>九、从URL中捕获文本的注意点</strong><br/>每个被捕获的参数将被作为纯Python字符串来发送，而不管正则表达式中的格式。举个例子，在这行URLConf中：<br/>(r'^articles/(?P&#92;d&#123;4&#125;)/$', views.year_archive),<br/>参数 year 是作为string传至 views.year_archive() ，而非integer，即使 &#92;d&#123;4&#125; 将只匹配整数的字符串。<br/>当你在写视图代码时记住这点很重要，许多Python内建的方法对于接受的对象的类型很讲究。很常见的错误时用字符串值而不是整数值来创建datetime.date对象：<br/>错误：<br/><textarea name="code" class="python" rows="15" cols="100">
def day_archive(request, year, month, day)
&nbsp;&nbsp;&nbsp;&nbsp;# The following statement raises a TypeError!
&nbsp;&nbsp;&nbsp;&nbsp;date = datetime.date(year, month, day)
</textarea><br/>正确：<br/><textarea name="code" class="python" rows="15" cols="100">
def day_archive(request, year, month, day)
&nbsp;&nbsp;&nbsp;&nbsp;date = datetime.date(int(year), int(month), int(day))
</textarea><br/><strong>十、包含(include)其他URLconf</strong><br/><textarea name="code" class="python" rows="15" cols="100">
from django.conf.urls.defaults import *
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^weblog/', include('mysite.blog.urls')),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^photos/', include('mysite.photos.urls')),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^about/$', 'mysite.views.about'),
)
&nbsp;&nbsp;&nbsp;&nbsp;---------------------------------
mysite.blog.urls
from django.conf.urls.defaults import *
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^(&#92;d&#92;d&#92;d&#92;d)/$', 'mysite.blog.views.year_detail'),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^(&#92;d&#92;d&#92;d&#92;d)/(&#92;d&#92;d)/$', 'mysite.blog.views.month_detail'),
)
</textarea><br/>*/weblog/2007/ ：在第一个URLconf中，模式 r'^weblog/' 被匹配。因为它是一个 include() ，Django将截掉所有匹配的文本，在这里是 'weblog/' 。URL剩余的部分是 2007/&#92; ， 将在 mysite.blog.urls ·这个URLconf的第一行中被匹配。<br/>*/weblog//2007/ ：在第一个URLconf中，模式 r'^weblog/' 被匹配。因为它是一个 include() ，Django将截掉所有匹配的文本，在这里是 'weblog/' 。URL剩余的部分是 /2007/ (开头有一个斜杠)，将不会匹配``mysite.blog.urls`` 中的任何URLconf。<br/>*/about/ : 这个匹配第一个URLconf中的``mysite.views.about``view。只是为了示范你可以混合``include()`` patterns和 non-include() patterns在一起使用。<br/><br/><strong>十一、捕获的参数如何让和 include()协同工作</strong><br/><textarea name="code" class="python" rows="15" cols="100">
# root urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^(?P&#92;w+)/blog/', include('foo.urls.blog')),
)
# foo/urls/blog.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^$', 'foo.views.blog_index'),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^archive/$', 'foo.views.blog_archive'),
)
</textarea><br/>在这个例子中，被捕获的”username”变量将传递给被included 的 URLconf，因此，在那个被included 的 URLconf中的每一个view函数都将获得那个参数。<br/><br/><strong>十二、额外的URLconf如何和include()协同工作</strong><br/>下面的两个URLconf在功能上是相等的。<br/><br/>第一个：<br/><textarea name="code" class="python" rows="15" cols="100">
# urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^blog/', include('inner'), &#123;'blogid': 3&#125;),
)
# inner.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^archive/$', 'mysite.views.archive'),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^about/$', 'mysite.views.about'),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^rss/$', 'mysite.views.rss'),
)
</textarea><br/>第二个<br/><textarea name="code" class="python" rows="15" cols="100">
# urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^blog/', include('inner')),
)
# inner.py
from django.conf.urls.defaults import *
urlpatterns = patterns('',
&nbsp;&nbsp;&nbsp;&nbsp;(r'^archive/$', 'mysite.views.archive', &#123;'blogid': 3&#125;),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^about/$', 'mysite.views.about', &#123;'blogid': 3&#125;),
&nbsp;&nbsp;&nbsp;&nbsp;(r'^rss/$', 'mysite.views.rss', &#123;'blogid': 3&#125;),
)
</textarea><br/>Tags - <a href="https://blog.liuts.com/tags/django/" rel="tag">django</a>
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post//#blogcomment</link>
<title><![CDATA[[评论] 我的Django学习笔记(最后更新2008-05-22)]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://blog.liuts.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>