﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Natural</title><link>http://www.blogjava.net/Man/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 01 May 2026 10:21:49 GMT</lastBuildDate><pubDate>Fri, 01 May 2026 10:21:49 GMT</pubDate><ttl>60</ttl><item><title>Wireshark远程抓包</title><link>http://www.blogjava.net/Man/archive/2013/11/19/406524.html</link><dc:creator>此号已被删</dc:creator><author>此号已被删</author><pubDate>Tue, 19 Nov 2013 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/Man/archive/2013/11/19/406524.html</guid><wfw:comment>http://www.blogjava.net/Man/comments/406524.html</wfw:comment><comments>http://www.blogjava.net/Man/archive/2013/11/19/406524.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Man/comments/commentRss/406524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Man/services/trackbacks/406524.html</trackback:ping><description><![CDATA[Wireshark安装时会同时安装上WinPcap。<br /><br />命令行进入WinPcap的安装目录下，运行&#8220;rpcapd -s rpcapd.ini&#8221;生成它的配置文件。（WIN7等操作系统由于权限问题，需要以管理员打开命令行）<br /><div><br />将允许空用户改为YES.&nbsp;<br />NullAuthPermit = YES</div><br />打开控制面板&#8212;&#8212;管理工具&#8212;&#8212;服务，启动&#8220;Remote Packet Capture Protocol&#8221;服务，这台机器即可通过该服务远程抓包了。<img src ="http://www.blogjava.net/Man/aggbug/406524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Man/" target="_blank">此号已被删</a> 2013-11-19 11:22 <a href="http://www.blogjava.net/Man/archive/2013/11/19/406524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django 使用LDAP验证登录</title><link>http://www.blogjava.net/Man/archive/2013/06/27/401013.html</link><dc:creator>此号已被删</dc:creator><author>此号已被删</author><pubDate>Thu, 27 Jun 2013 08:30:00 GMT</pubDate><guid>http://www.blogjava.net/Man/archive/2013/06/27/401013.html</guid><wfw:comment>http://www.blogjava.net/Man/comments/401013.html</wfw:comment><comments>http://www.blogjava.net/Man/archive/2013/06/27/401013.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/Man/comments/commentRss/401013.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Man/services/trackbacks/401013.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 学习Django做了个小网站，但是如果只用在公司内部的话，特此又要员工注册网站帐号，这个是个槽糕的问题。<br />
<br />
&nbsp;&nbsp;&nbsp; 最好的方式就是直接使用员工的计算机帐号来登录，那样就不用为又要为记住个新帐号名密码而苦恼了。<br />
<br />
&nbsp;&nbsp;&nbsp; 恰好公司有LDAP服务器，并且存有员工账号信息。这样就可以通过Django的LDAP插件，来完成员工帐号的登录验证功能。<br />
<br />
<div>&nbsp;&nbsp;&nbsp; 首先需要安装以下模块：<br />
&nbsp;&nbsp;&nbsp; python-ldap 2.4.12&nbsp;&nbsp;&nbsp; <a target="_blank" href="https://pypi.python.org/pypi/python-ldap/2.4.12">https://pypi.python.org/pypi/python-ldap/2.4.12</a>
<div>
<div>&nbsp;&nbsp;&nbsp; django-auth-ldap 1.1.4&nbsp;&nbsp; <a target="_blank" href="https://pypi.python.org/pypi/django-auth-ldap/1.1.4">https://pypi.python.org/pypi/django-auth-ldap/1.1.4
</a></div>
</div>
<br />
<span style="color: black; letter-spacing: 0.4pt; font-family: 宋体; font-size: 10.5pt;"><span style="color: black; letter-spacing: 0.4pt; font-family: 宋体; font-size: 10.5pt;"><span style="color: black; letter-spacing: 0.4pt; font-family: 宋体; font-size: 10.5pt;"><span style="color: black; letter-spacing: 0.4pt; font-family: 宋体; font-size: 10.5pt;"></span></span></span></span>&nbsp;&nbsp;&nbsp; <span style="color: black; letter-spacing: 0.4pt; font-family: 宋体; font-size: 10.5pt;"><span style="color: black; letter-spacing: 0.4pt; font-family: 宋体; font-size: 10.5pt;"><span style="color: black; letter-spacing: 0.4pt; font-family: 宋体; font-size: 10.5pt;"><span style="color: black; letter-spacing: 0.4pt; font-family: 宋体; font-size: 10.5pt;">安装完成后，django项目中settings.py的ldap配置如下:<br />
</span></span></span></span>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">LDAP&nbsp;configuration</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;ldap<br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django_auth_ldap.config&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;LDAPSearch<br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">AUTHENTICATION_BACKENDS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(<br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">django_auth_ldap.backend.LDAPBackend</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,<br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">django.contrib.auth.backends.ModelBackend</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;&nbsp;<br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">)<br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">AUTH_LDAP_SERVER_URI&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">ldap://SERVER_IP</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">AUTH_LDAP_BIND_DN&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">CN=ACCOUNT_NAME,OU=Accounts,DC=ldap,DC=example,DC=com</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">AUTH_LDAP_BIND_PASSWORD&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">PASSWORD</span><span style="color: #800000; ">"</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">AUTH_LDAP_USER_SEARCH&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;LDAPSearch(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">OU=Accounts,DC=ldap,DC=example,DC=com</span><span style="color: #800000; ">"</span><span style="color: #000000; ">,&nbsp;ldap.SCOPE_SUBTREE,&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">(&amp;(objectClass=person)(sAMAccountName=%(user)s))</span><span style="color: #800000; ">"</span><span style="color: #000000; ">)<br />
</span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">AUTH_LDAP_USER_ATTR_MAP&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{<br />
</span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">first_name</span><span style="color: #800000; ">"</span><span style="color: #000000; ">:&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">givenName</span><span style="color: #800000; ">"</span><span style="color: #000000; ">,<br />
</span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">last_name</span><span style="color: #800000; ">"</span><span style="color: #000000; ">:&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">sn</span><span style="color: #800000; ">"</span><span style="color: #000000; ">,<br />
</span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">email</span><span style="color: #800000; ">"</span><span style="color: #000000; ">:&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">mail</span><span style="color: #800000; ">"</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">}</span></div>
<br />
<div>&nbsp;&nbsp;&nbsp; 工作流程：<br />
<div>&nbsp;&nbsp;&nbsp; 登录时，在默认的django数据库帐号验证之前，会先到LDAP服务器上去验证。<br /><span style="color: #000000; ">
</span>&nbsp;&nbsp;&nbsp; 输入的登录帐号到LDAP服务器验证之前，会先用配置文件中的绑定DN、密码去验证，验证通过才能继续用输入的帐号密码去LDAP服务器验证。<br />
&nbsp;&nbsp;&nbsp; 若LDAP验证通过，会检查django数据库中是否已存在该帐号，若不存在，则会根据LDAP验证通过后获取的用户信息，来创建django数据库的用户账号。帐号名和输入的一样，密码则会设为一个无效的密码（看了下源码是"!",无法合法哈希编码），因为该帐号密码验证是从LDAP上进行，所以django中的密码不会被使用到。除了默认的用户姓名、邮件等信息，若要把Group信息也同步过来的话需要进行相应的配置。<br />&nbsp;&nbsp;&nbsp; 若LDAP验证失败，则会使用Django数据库的默认登录验证。<br />
<br />
&nbsp;&nbsp;&nbsp; PS: LDAP快速入门&nbsp;&nbsp;
<a target="_blank" href="http://www.cnblogs.com/obpm/archive/2010/08/28/1811065.html">http://www.cnblogs.com/obpm/archive/2010/08/28/1811065.html</a>
</div>
</div>
</div><img src ="http://www.blogjava.net/Man/aggbug/401013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Man/" target="_blank">此号已被删</a> 2013-06-27 16:30 <a href="http://www.blogjava.net/Man/archive/2013/06/27/401013.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django 国际化</title><link>http://www.blogjava.net/Man/archive/2013/05/10/399116.html</link><dc:creator>此号已被删</dc:creator><author>此号已被删</author><pubDate>Fri, 10 May 2013 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/Man/archive/2013/05/10/399116.html</guid><wfw:comment>http://www.blogjava.net/Man/comments/399116.html</wfw:comment><comments>http://www.blogjava.net/Man/archive/2013/05/10/399116.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Man/comments/commentRss/399116.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Man/services/trackbacks/399116.html</trackback:ping><description><![CDATA[Django 1.5<br />Python 2.7.3<br /><br />&nbsp;&nbsp;&nbsp; 国际化支持，网上一搜详细的例子很多。本以为是一个简单的case，结果折腾了好几个小时却百撕不得骑姐！！最终去翻看官方教程，总算找到解决方案。<br /><br />&nbsp;&nbsp;&nbsp; 简单说下如何国际化支持（以中文国际化为例）：（详情参阅：http://djangobook.py3k.cn/2.0/chapter19/）<br /><br /><div>&nbsp;&nbsp;&nbsp; 对 Django 中 Python 代码进行国际化主要用到 ugettext()，gettext_noop()，gettext_lazy() 和 ungettext() 等函数；模板中则使用trans、blocktrans标签。<br /><br />国际化步骤：<br /><div>&nbsp;&nbsp;&nbsp; 1.在你的App 目录下创建 locale 目录，并运行&#8220;django-admin.py makemessages -l zh_CN&#8221;产生 locale/zh_CN/LC_MESSAGES/django.po 文件。它会自动搜索目录下所有需要国际化的内容，生成一个清单文件（django.po）,然后打开该文件，加上对应的中文翻译即可。<br />&nbsp;&nbsp;&nbsp; 2.运行&#8220;django-admin.py compilemessages&#8221;命令，生成一个django.mo文件，这是真正在运行时所调用的。<br /><br />按照教程所说，django运行时会根据算法自动找到该文件，然而遇到的问题是它没有被找到。显示的依然是默认的英文。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">Django使用以下算法寻找翻译：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;首先，Django在该视图所在的应用程序文件夹中寻找&nbsp;locale&nbsp;目录。&nbsp;若找到所选语言的翻译，则加载该翻译。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;第二步，Django在项目目录中寻找&nbsp;locale&nbsp;目录。&nbsp;若找到翻译，则加载该翻译。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;最后，Django使用&nbsp;django</span><span style="color: #000000; ">/</span><span style="color: #000000; ">conf</span><span style="color: #000000; ">/</span><span style="color: #000000; ">locale&nbsp;目录中的基本翻译。</span></div></div>估计这个问题与我的项目的目录结构有关，app没有直接在项目的根目录下，而是中间多了一个目录apps。（感兴趣的可参考一下：<a target="_blank" href="http://www.cnblogs.com/holbrook/archive/2012/02/25/2368231.html">django最佳实践：项目布局</a> ）<br /><div></div>翻看了下官方文挡，总算找到了解决办法：<br />在项目的settings.py配置文件中，添加<strong>LOCALE_PATHS</strong>变量，把locale目录添加到其中（<a target="_blank" href="https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-LOCALE_PATHS">官方链接</a>）。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">LOCALE_PATHS&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">/home/www/project/common_files/locale</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">/var/local/translations/locale</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br />)</span></div><br />在django1.5下，国际化默认是支持的，并不需要像各教程所说那样在配置文件中添加相应的中间件（默认已经加上了）。如果你发现你的国际化资源文件没有被载入，那就去上面这个变量中添加locale路径吧。</div><img src ="http://www.blogjava.net/Man/aggbug/399116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Man/" target="_blank">此号已被删</a> 2013-05-10 16:24 <a href="http://www.blogjava.net/Man/archive/2013/05/10/399116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django官方文档学习笔记：Tutorial: Part 3</title><link>http://www.blogjava.net/Man/archive/2013/05/10/397539.html</link><dc:creator>此号已被删</dc:creator><author>此号已被删</author><pubDate>Fri, 10 May 2013 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/Man/archive/2013/05/10/397539.html</guid><wfw:comment>http://www.blogjava.net/Man/comments/397539.html</wfw:comment><comments>http://www.blogjava.net/Man/archive/2013/05/10/397539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Man/comments/commentRss/397539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Man/services/trackbacks/397539.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 继续折腾官方文档教程上的投票应用，这回主要是讲如何创建django的视图（views）。<br />
&nbsp;&nbsp;&nbsp; view是django应用中网页的一种类型，每个view有一个特定的模板，服务于一个特定的方法。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; 投票系统这个应用比较简洁，主要有以下4个views：<br />
<div>
<ul>
     <li>Poll &#8220;index&#8221; page &#8211; displays the latest few polls.</li>
     <li>Poll &#8220;detail&#8221; page &#8211; displays a poll question, with no results but with a form to vote.</li>
     <li>Poll &#8220;results&#8221; page &#8211; displays results for a particular poll.</li>
     <li>Vote action &#8211; handles voting for a particular choice in a particular poll.</li>
</ul>
</div>
&nbsp;&nbsp;&nbsp; 如何从一个url访问其对应的view，与URLconf有关。<br />
<br />
&nbsp;&nbsp;&nbsp; <strong style="font-size: 14pt;">1、写第一个view</strong><br />
&nbsp;&nbsp;&nbsp; 修改&#8220;<span style="background-color: #99cc00;">polls/views.py</span>&#8221;文件，输出hello world。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.http&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;HttpResponse<br />
<br />
</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;index(request):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;HttpResponse(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">Hello,&nbsp;world.&nbsp;poll&nbsp;index.</span><span style="color: #800000; ">"</span><span style="color: #000000; ">);</span></div>
&nbsp;&nbsp;&nbsp; 修改poll应用的url文件（"<span style="background-color: #99cc00;">polls/urls.py</span>"）：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.conf.urls&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;patterns,&nbsp;url<br />
</span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;polls&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;views<br />
<br />
urlpatterns&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;patterns(</span><span style="color: #800000; ">''</span><span style="color: #000000; ">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^$</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;views.index,&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">index</span><span style="color: #800000; ">'</span><span style="color: #000000; ">),<br />
)<br />
</span></div>
&nbsp;&nbsp;&nbsp; 修改项目的url文件（"<span style="background-color: #99cc00;">mysite/urls.py</span>"）：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.conf.urls&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;patterns,&nbsp;include,&nbsp;url<br />
<br />
</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Uncomment&nbsp;the&nbsp;next&nbsp;two&nbsp;lines&nbsp;to&nbsp;enable&nbsp;the&nbsp;admin:</span><span style="color: #008000; "><br />
</span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.contrib&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;admin<br />
admin.autodiscover()<br />
<br />
urlpatterns&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;patterns(</span><span style="color: #800000; ">''</span><span style="color: #000000; ">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Examples:</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;url(r'^$',&nbsp;'mysite.views.home',&nbsp;name='home'),</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;url(r'^mysite/',&nbsp;include('mysite.foo.urls')),</span><span style="color: #008000; "><br />
</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Uncomment&nbsp;the&nbsp;admin/doc&nbsp;line&nbsp;below&nbsp;to&nbsp;enable&nbsp;admin&nbsp;documentation:</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;url(r'^admin/doc/',&nbsp;include('django.contrib.admindocs.urls')),</span><span style="color: #008000; "><br />
</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Uncomment&nbsp;the&nbsp;next&nbsp;line&nbsp;to&nbsp;enable&nbsp;the&nbsp;admin:</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^polls/</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;include(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">polls.urls</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)),<br />
&nbsp;&nbsp;&nbsp;&nbsp;url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^admin/</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;include(admin.site.urls)),<br />
)<br />
</span></div>
<div>&nbsp;&nbsp;&nbsp; 从上述代码可以看出，<span style="color: #000000;">视图通过HttpResponse对象来显示页面。http访问时，</span>url则是先通过项目的url文件（"<span style="background-color: #99cc00;">mysite/urls.py</span>"）正则表达式匹配过滤，再到具体应用的urls文件匹配视图。</div>
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <strong>url()方法参数</strong>：regex,view,kwargs,name<br />
&nbsp;&nbsp;&nbsp; regex&nbsp;&nbsp;&nbsp; &nbsp; 正则表达式匹配url链接（不含参数）。例如访问&#8220;
<div style="display: inline-block;">
<div><tt class="docutils literal"><span class="pre">http://www.example.com/myapp/?page=3</span></tt></div>
</div>
&#8221;，url链接部分为&#8220;myapp/&#8221;;<br />
&nbsp;&nbsp;&nbsp; view&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 视图。url访问时，Django匹配到对应的url链接，则会调用其对应的view方法;<br />
&nbsp;&nbsp;&nbsp; kwargs&nbsp;&nbsp;&nbsp; 传递给目标view的参数;<br />
&nbsp;&nbsp;&nbsp; name&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 给url命名，以便于识别;<br />
<br />
&nbsp;&nbsp;&nbsp; <strong style="font-size: 14pt;">2、写多个views</strong><br style="font-size: 14pt;" />
&nbsp;&nbsp;&nbsp; 请求的url根据正则表达式匹配对应的视图。<br />
<div>&nbsp;&nbsp;&nbsp; 修改poll应用的views文件（"<span style="background-color: #99cc00;">polls/views.py</span>"）：<br />
<div>&nbsp;&nbsp;&nbsp; index演示了查询最近5条poll记录，并把poll的question以逗号连接返回到页面。</div>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.http&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;HttpResponse<br />
</span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;polls.models&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;Poll<br />
<br />
</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;index(request):<br />
&nbsp;&nbsp;&nbsp;&nbsp;latest_poll_list&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Poll.objects.order_by(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">-pub_date</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)[:</span><span style="color: #000000; ">5</span><span style="color: #000000; ">]<br />
&nbsp;&nbsp;&nbsp;&nbsp;output&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #000000; ">.join([p.question&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;p&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;latest_poll_list])<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;HttpResponse(output)<br />
<br />
</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;detail(request,&nbsp;poll_id):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;HttpResponse(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">You're&nbsp;looking&nbsp;at&nbsp;poll&nbsp;%s.</span><span style="color: #800000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;poll_id)<br />
<br />
</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;results(request,&nbsp;poll_id):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;HttpResponse(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">You're&nbsp;looking&nbsp;at&nbsp;the&nbsp;results&nbsp;of&nbsp;poll&nbsp;%s.</span><span style="color: #800000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;poll_id)<br />
<br />
</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;vote(request,&nbsp;poll_id):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;HttpResponse(</span><span style="color: #800000; ">"</span><span style="color: #800000; ">You're&nbsp;voting&nbsp;on&nbsp;poll&nbsp;%s.</span><span style="color: #800000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;poll_id)<br />
</span></div>
</div>
<br />
&nbsp;&nbsp;&nbsp; 修改poll应用的url文件（"<span style="background-color: #99cc00;">polls/urls.py</span>"）：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.conf.urls&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;patterns,&nbsp;url<br />
</span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;polls&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;views<br />
<br />
urlpatterns&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;patterns(</span><span style="color: #800000; ">''</span><span style="color: #000000; ">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;ex:&nbsp;/polls/</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^$</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;views.index,&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">index</span><span style="color: #800000; ">'</span><span style="color: #000000; ">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;ex:&nbsp;/polls/5/</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^(?P&lt;poll_id&gt;\d+)/$</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;views.detail,&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">detail</span><span style="color: #800000; ">'</span><span style="color: #000000; ">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;ex:&nbsp;/polls/5/results/</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^(?P&lt;poll_id&gt;\d+)/results/$</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;views.results,&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">results</span><span style="color: #800000; ">'</span><span style="color: #000000; ">),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;ex:&nbsp;/polls/5/vote/</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^(?P&lt;poll_id&gt;\d+)/vote/$</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;views.vote,&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">vote</span><span style="color: #800000; ">'</span><span style="color: #000000; ">),<br />
)<br />
</span></div>
<br />
&nbsp;&nbsp;&nbsp; <strong style="font-size: 14pt;">3、使用模板来展示页面</strong><br style="font-size: 14pt;" />
<div>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">为了提高效率，使用模板功能来定义html页面布局。</span></p>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">创建index</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">模板文件</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">（"</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; background:#99cc00; ">polls/</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; background:#99cc00; ">templates/polls/index.html</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">"）：</span></p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">{%&nbsp;if&nbsp;latest_poll_list&nbsp;%}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">ul</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;{%&nbsp;for&nbsp;poll&nbsp;in&nbsp;latest_poll_list&nbsp;%}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">li</span><span style="color: #0000FF; ">&gt;&lt;</span><span style="color: #800000; ">a&nbsp;</span><span style="color: #FF0000; ">href</span><span style="color: #0000FF; ">="/polls/{{&nbsp;poll.id&nbsp;}}/"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">{{&nbsp;poll.question&nbsp;}}</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">a</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">li</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;{%&nbsp;endfor&nbsp;%}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">ul</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
{%&nbsp;else&nbsp;%}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">p</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">No&nbsp;polls&nbsp;are&nbsp;available.</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">p</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
{%&nbsp;endif&nbsp;%}</span></div>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; ">html模板中使用了django的标记语言。views中会载入模板渲染，填充数据到标记，生成最终的web页面返回。<br />
<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; "></span></p>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><br />
</p>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; ">修改views的index方法（"<span style="background-color: #99cc00;">polls/views.py</span>"）：</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.http&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;HttpResponse<br />
</span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.template&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;Context,&nbsp;loader<br />
</span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;polls.models&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;Poll<br />
<br />
</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;index(request):<br />
&nbsp;&nbsp;&nbsp;&nbsp;latest_poll_list&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Poll.objects.order_by(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">-pub_date</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)[:</span><span style="color: #000000; ">5</span><span style="color: #000000; ">]<br />
&nbsp;&nbsp;&nbsp;&nbsp;template&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;loader.get_template(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">polls/index.html</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;context&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Context({<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">latest_poll_list</span><span style="color: #800000; ">'</span><span style="color: #000000; ">:&nbsp;&nbsp;latest_poll_list,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;HttpResponse(template.render(context))<br />
</span></div>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><br />
</p>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><strong>方法简化：render()</strong><br />
</p>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; ">这是个可以简化views中生成页面的API，让代码更简洁一点。</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.shortcuts&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;render</span><span style="color: #000000; "><br />
<br />
</span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;polls.models&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;Poll<br />
<br />
</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;index(request):<br />
&nbsp;&nbsp;&nbsp;&nbsp;latest_poll_list&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Poll.objects.order_by(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">-pub_date</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)[:</span><span style="color: #000000; ">5</span><span style="color: #000000; ">]<br />
&nbsp;&nbsp;&nbsp;&nbsp;context&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;{</span><span style="color: #800000; ">'</span><span style="color: #800000; ">latest_poll_list</span><span style="color: #800000; ">'</span><span style="color: #000000; ">:&nbsp;&nbsp;latest_poll_list}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;render(request,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">polls/index.html</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;context)</span></div>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><strong style="font-size: 14pt;"><br />
</strong></p>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><strong style="font-size: 14pt;">4、抛出404异常</strong></p>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; ">detail视图找不到匹配poll请求时，返回一个http404异常。<br />
</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.http&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;Http404<br />
</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;detail(request,&nbsp;poll_id):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;poll&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Poll.objects.get(pk</span><span style="color: #000000; ">=</span><span style="color: #000000; ">poll_id)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">except</span><span style="color: #000000; ">&nbsp;Poll.DoesNotExist:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">raise</span><span style="color: #000000; ">&nbsp;Http404<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;&nbsp;render(request,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">polls/detail.html</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;{</span><span style="color: #800000; ">'</span><span style="color: #800000; ">poll</span><span style="color: #800000; ">'</span><span style="color: #000000; ">:&nbsp;poll})</span></div>
<p>&nbsp;</p>
<div>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">创建detail</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; ">模板文件</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">（"</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; background:#99cc00; ">polls/</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; background:#99cc00; ">templates/polls/detail.html</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">"）：</span></p>
</div>
<p>&nbsp;</p>
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">h1</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">{{&nbsp;poll.question&nbsp;}}</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">h1</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">ul</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
{%&nbsp;for&nbsp;choice&nbsp;in&nbsp;poll.choice_set.all&nbsp;%}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">li</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">{{&nbsp;choice.choice_text&nbsp;}}</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">li</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
{%&nbsp;endfor&nbsp;%}<br />
</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">ul</span><span style="color: #0000FF; ">&gt;</span></div>
<p>&nbsp;&nbsp;&nbsp;<strong> <br />
</strong></p>
<p>&nbsp;&nbsp;&nbsp; <strong>方法简化：get_object_or_404()</strong><br />
</p>
<div>&nbsp;&nbsp;&nbsp; 使用该API简化模型与视图的耦合度。<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.shortcuts&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;render,&nbsp;get_object_or_404</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;polls.models&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;Poll<br />
</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;detail(request,&nbsp;poll_id):<br />
&nbsp;&nbsp;&nbsp;&nbsp;poll&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;get_object_or_404(Poll,&nbsp;pk</span><span style="color: #000000; ">=</span><span style="color: #000000; ">poll_id)<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;&nbsp;render(request,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">polls/detail.html</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;{</span><span style="color: #800000; ">'</span><span style="color: #800000; ">poll</span><span style="color: #800000; ">'</span><span style="color: #000000; ">:&nbsp;poll})</span></div>
</div>
<p>&nbsp;</p>
<div>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><strong style="font-size: 14pt;"><br />
</strong></p>
<p style="text-indent:21.0000pt; margin-bottom:0pt; margin-top:0pt; "><strong style="font-size: 14pt;">5、除掉模板中url的硬编码</strong></p>

<p>
&nbsp;&nbsp;&nbsp;&nbsp; 前者index模板中存在url硬编码，如果以后项目polls链接发生变动，则模板也要一起修改。</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">li</span><span style="color: #0000FF; ">&gt;&lt;</span><span style="color: #800000; ">a&nbsp;</span><span style="color: #FF0000; ">href</span><span style="color: #0000FF; ">="/polls/{{&nbsp;poll.id&nbsp;}}/"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">{{&nbsp;poll.question&nbsp;}}</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">a</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">li</span><span style="color: #0000FF; ">&gt;</span></div><p>
</p>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 使用模板语言的<tt literal"="">{% url %}</tt>标记可以消除这种问题。</p><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">li</span><span style="color: #0000FF; ">&gt;&lt;</span><span style="color: #800000; ">a&nbsp;</span><span style="color: #FF0000; ">href</span><span style="color: #0000FF; ">="{%&nbsp;url&nbsp;'detail'&nbsp;poll.id&nbsp;%}"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">{{&nbsp;poll.question&nbsp;}}</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">a</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">li</span><span style="color: #0000FF; ">&gt;</span></div><p>&nbsp;&nbsp;&nbsp; 通过url标记，来调用urls.py（"<span style="background-color: #99cc00;">polls/urls.py</span>"）配置文件中取名为detail的url链接。<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^(?P&lt;poll_id&gt;\d+)/$</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;views.detail,&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">detail</span><span style="color: #800000; ">'</span><span style="color: #000000;">),</span></div><p>&nbsp;&nbsp;&nbsp; 如果url有所变动，例如在原有基础上增加（<tt literal"="">&#8220;polls/specifics/12/</tt><tt>&#8221;</tt>）</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^specifics/(?P&lt;poll_id&gt;\d+)/$</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;views.detail,&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">detail</span><span style="color: #800000; ">'</span><span style="color: #000000; ">),</span></div><p><br /></p><p>&nbsp;&nbsp;&nbsp; <strong style="font-size: 14pt;">6、URL命名空间</strong></p><p>&nbsp;&nbsp;&nbsp; 项目存在多个应用时，不同应用之间url名字可能存在重复。给每个应用加上命名空间以避免命名冲突问题。</p><p>&nbsp;&nbsp;&nbsp; 给项目的url配置文件（"<span style="background-color: #99cc00;">mysite/urls.py</span>"）加上命名空间：</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.conf.urls&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;patterns,&nbsp;include,&nbsp;url<br /><br /></span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.contrib&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;admin<br />admin.autodiscover()<br /><br />urlpatterns&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;patterns(</span><span style="color: #800000; ">''</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^polls/</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;include(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">polls.urls</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;namespace</span><span style="color: #000000; ">=</span><span style="color: #800000; ">"</span><span style="color: #800000; ">polls</span><span style="color: #800000; ">"</span><span style="color: #000000; ">)),<br />&nbsp;&nbsp;&nbsp;&nbsp;url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^admin/</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;include(admin.site.urls)),<br />)</span></div><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp; index.html调用url标记时，加上命名空间前缀。<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">li</span><span style="color: #0000FF; ">&gt;&lt;</span><span style="color: #800000; ">a&nbsp;</span><span style="color: #FF0000; ">href</span><span style="color: #0000FF; ">="{%&nbsp;url&nbsp;'polls:detail'&nbsp;poll.id&nbsp;%}"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">{{&nbsp;poll.question&nbsp;}}</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">a</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">li</span><span style="color: #0000FF; ">&gt;</span></div><p><br /></p><p><br /></p><p><br /></p>
</div><img src ="http://www.blogjava.net/Man/aggbug/397539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Man/" target="_blank">此号已被删</a> 2013-05-10 15:36 <a href="http://www.blogjava.net/Man/archive/2013/05/10/397539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django官方文档学习笔记：Tutorial: Part 4</title><link>http://www.blogjava.net/Man/archive/2013/05/10/397707.html</link><dc:creator>此号已被删</dc:creator><author>此号已被删</author><pubDate>Fri, 10 May 2013 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/Man/archive/2013/05/10/397707.html</guid><wfw:comment>http://www.blogjava.net/Man/comments/397707.html</wfw:comment><comments>http://www.blogjava.net/Man/archive/2013/05/10/397707.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Man/comments/commentRss/397707.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Man/services/trackbacks/397707.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 继续折腾这个投票应用，本章主要讲如何处理表单。&nbsp;&nbsp;&nbsp; <br /><br />&nbsp;&nbsp;&nbsp; <strong style="font-size: 14pt;">一、写一个表单</strong><br style="font-size: 14pt;" /><div>&nbsp;&nbsp;&nbsp; <span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">修改原来的detail.html模板（"</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; background:#99cc00; ">polls/</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; background:#99cc00; ">templates/polls/detail.html</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">"）：</span><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">h1</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">{{&nbsp;poll.question&nbsp;}}</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">h1</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /><br />{%&nbsp;if&nbsp;error_message&nbsp;%}</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">p</span><span style="color: #0000FF; ">&gt;&lt;</span><span style="color: #800000; ">strong</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">{{&nbsp;error_message&nbsp;}}</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">strong</span><span style="color: #0000FF; ">&gt;&lt;/</span><span style="color: #800000; ">p</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">{%&nbsp;endif&nbsp;%}<br /><br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">form&nbsp;</span><span style="color: #FF0000; ">action</span><span style="color: #0000FF; ">="{%&nbsp;url&nbsp;'polls:vote'&nbsp;poll.id&nbsp;%}"</span><span style="color: #FF0000; ">&nbsp;method</span><span style="color: #0000FF; ">="post"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />{%&nbsp;csrf_token&nbsp;%}<br />{%&nbsp;for&nbsp;choice&nbsp;in&nbsp;poll.choice_set.all&nbsp;%}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">input&nbsp;</span><span style="color: #FF0000; ">type</span><span style="color: #0000FF; ">="radio"</span><span style="color: #FF0000; ">&nbsp;name</span><span style="color: #0000FF; ">="choice"</span><span style="color: #FF0000; ">&nbsp;id</span><span style="color: #0000FF; ">="choice{{&nbsp;forloop.counter&nbsp;}}"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="{{&nbsp;choice.id&nbsp;}}"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">label&nbsp;</span><span style="color: #FF0000; ">for</span><span style="color: #0000FF; ">="choice{{&nbsp;forloop.counter&nbsp;}}"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">{{&nbsp;choice.choice_text&nbsp;}}</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">label</span><span style="color: #0000FF; ">&gt;&lt;</span><span style="color: #800000; ">br&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />{%&nbsp;endfor&nbsp;%}<br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">input&nbsp;</span><span style="color: #FF0000; ">type</span><span style="color: #0000FF; ">="submit"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="Vote"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000;"><br /></span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">form</span><span style="color: #0000FF; ">&gt;</span></div></div>&nbsp;&nbsp;&nbsp; forloop.counter&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; for循环的次数<br /><div>&nbsp;&nbsp;&nbsp; {% csrf_token %}&nbsp;&nbsp;&nbsp; 避免别的网站伪造post请求数据。</div><br />&nbsp;&nbsp;&nbsp; 如代码所描述的，post之后会跳到vote去，修改poll应用的views.py（"<span style="background-color: #99cc00;">polls/views.py</span>"）实现一下vote响应方法。<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Create&nbsp;your&nbsp;views&nbsp;here.</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.shortcuts&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;get_object_or_404,&nbsp;render<br /></span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.http&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;HttpResponse,&nbsp;HttpResponseRedirect<br /></span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.core.urlresolvers&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;reverse<br /><br /></span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;polls.models&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;Poll,&nbsp;Choice<br /><br /></span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;vote(request,&nbsp;poll_id):<br />&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;get_object_or_404(Poll,&nbsp;pk</span><span style="color: #000000; ">=</span><span style="color: #000000; ">poll_id)<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selected_choice&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;p.choice_set.get(pk</span><span style="color: #000000; ">=</span><span style="color: #000000; ">request.POST[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">choice</span><span style="color: #800000; ">'</span><span style="color: #000000; ">])<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">except</span><span style="color: #000000; ">&nbsp;(KeyError,&nbsp;Choice.DoesNotExist):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;render(request,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">polls/detail.html</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">poll</span><span style="color: #800000; ">'</span><span style="color: #000000; ">:&nbsp;p,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">error_message</span><span style="color: #800000; ">'</span><span style="color: #000000; ">:&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">You&nbsp;din't&nbsp;select&nbsp;a&nbsp;choice.</span><span style="color: #800000; ">"</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selected_choice.votes&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selected_choice.save()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;Always&nbsp;return&nbsp;an&nbsp;HttpResponseRedirect&nbsp;after&nbsp;successfully&nbsp;dealing</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;with&nbsp;POST&nbsp;data.&nbsp;This&nbsp;prevents&nbsp;data&nbsp;from&nbsp;being&nbsp;posted&nbsp;twice&nbsp;if&nbsp;a</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;user&nbsp;hits&nbsp;the&nbsp;Back&nbsp;button.</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;HttpResponseRedirect(reverse(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">polls:results</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;args</span><span style="color: #000000; ">=</span><span style="color: #000000; ">(p.id,)))</span><span style="color: #000000;"><br /></span></div>&nbsp;&nbsp;&nbsp; request.POST&nbsp;&nbsp;&nbsp; 根据key访问post提交的数据。同理get请求则使用request.GET<br />&nbsp;&nbsp;&nbsp; request.POST['choice']&nbsp;&nbsp;&nbsp; 如果post数据中没有choice，会爆出KeyError异常。<br />&nbsp;&nbsp;&nbsp; HttpResponseRedirect&nbsp;&nbsp;&nbsp; 页面重定向。避免post多次。<br />&nbsp;&nbsp;&nbsp; reverse()&nbsp;&nbsp;&nbsp; 调用url链接，避免硬编码。<br /><br />&nbsp;&nbsp;&nbsp; 创建results模板文件（<span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">"</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; background:#99cc00; ">polls/</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'宋体'; background:#99cc00; ">templates/polls/results.html</span><span style="mso-spacerun:'yes'; font-size:10.5000pt; font-family:'Times New Roman'; ">"）</span>。<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">h1</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">{{&nbsp;poll.question&nbsp;}}</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">h1</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">ul</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />{%&nbsp;for&nbsp;choice&nbsp;in&nbsp;poll.choice_set.all&nbsp;%}<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">li</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">{{&nbsp;choice.choice_text&nbsp;}}&nbsp;--&nbsp;{{&nbsp;choice.votes&nbsp;}}&nbsp;vote{{&nbsp;choice.votes|pluralize&nbsp;}}</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">li</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000;"><br />{%&nbsp;endfor&nbsp;%}<br /></span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">ul</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">a&nbsp;</span><span style="color: #FF0000; ">href</span><span style="color: #0000FF; ">="{%&nbsp;url&nbsp;'polls:detail'&nbsp;poll.id&nbsp;%}"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Vote&nbsp;again?</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">a</span><span style="color: #0000FF; ">&gt;</span></div><br />&nbsp;&nbsp;&nbsp; <strong style="font-size: 14pt;">二、使用通用视图：减少代码</strong><br style="font-size: 14pt;" />&nbsp;&nbsp;&nbsp; 在web开发中，从数据库查询，并渲染模板页面到显示，这是个很常见的情况。Django提供了一个用来快速生成视图的&#8220;generic views&#8221;系统。可以将通用的ListView、DetailView的渲染通过它在URLconf中完成。<br />&nbsp;&nbsp;&nbsp; <strong>修改URLconf</strong><br /><div>&nbsp;&nbsp;&nbsp; 修改poll应用的urls配置文件（"<span style="background-color: #99cc00;">polls/urls.py</span>"）：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.conf.urls&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;patterns,&nbsp;url<br /></span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.views.generic&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;ListView<br /></span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.views.generic.detail&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;DetailView<br /></span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;polls.models&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;Poll<br /><br />urlpatterns&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;patterns(</span><span style="color: #800000; ">''</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;ex:&nbsp;/polls/</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^$</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;ListView.as_view(queryset</span><span style="color: #000000; ">=</span><span style="color: #000000; ">Poll.objects.order_by(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">-pub_date</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)[:</span><span style="color: #000000; ">5</span><span style="color: #000000; ">],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context_object_name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">latest_poll_list</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template_name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">polls/index.html</span><span style="color: #800000; ">'</span><span style="color: #000000; ">),&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">index</span><span style="color: #800000; ">'</span><span style="color: #000000; ">),<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;ex:&nbsp;/polls/5/</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^(?P&lt;pk&gt;\d+)/$</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;DetailView.as_view(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model</span><span style="color: #000000; ">=</span><span style="color: #000000; ">Poll,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template_name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">polls/detail.html</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">detail</span><span style="color: #800000; ">'</span><span style="color: #000000; ">),<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;ex:&nbsp;/polls/5/results/</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^(?P&lt;pk&gt;\d+)/results/$</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;DetailView.as_view(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model</span><span style="color: #000000; ">=</span><span style="color: #000000; ">Poll,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template_name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">polls/results.html</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">results</span><span style="color: #800000; ">'</span><span style="color: #000000; ">),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;ex:&nbsp;/polls/5/vote/</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^(?P&lt;poll_id&gt;\d+)/vote/$</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">polls.views.vote</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #800000; ">'</span><span style="color: #800000; ">vote</span><span style="color: #800000; ">'</span><span style="color: #000000;">),<br />)<br /></span></div>&nbsp;&nbsp;&nbsp; </div>&nbsp;&nbsp;&nbsp; <strong>修改views</strong><br /><div>&nbsp;&nbsp;&nbsp; 到此，可以把原视图（"<span style="background-color: #99cc00;">polls/views.py</span>"）中的index()、detail()、results()方法删掉了。</div><br />&nbsp;&nbsp;&nbsp; 这里使用了ListView、DetailView。需要注意的是，DetailView使用&#8220;<strong>pk</strong>&#8221;去匹配url中的id。<br />&nbsp;&nbsp;&nbsp; DetailView、ListView默认分别调用&#8220;&lt;app_name&gt;/&lt;model_name&gt;_detail.html&#8221;、&#8220;&lt;app_name&gt;/&lt;model_name&gt;_list.html&#8221;模板，可以通过&#8220;<strong>template_name</strong>&#8221;参数指定特定的模板。<br />&nbsp;&nbsp;&nbsp; ListView默认生成的传递给模板的上下文变量为&#8220;&lt;model_name&gt;_list&#8221;，可通过&#8220;<strong><span style="color: #000000; ">context_object_name</span></strong>&#8221;参数来指定传输变量。<br />&nbsp;&nbsp;&nbsp;<img src ="http://www.blogjava.net/Man/aggbug/397707.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Man/" target="_blank">此号已被删</a> 2013-05-10 15:36 <a href="http://www.blogjava.net/Man/archive/2013/05/10/397707.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django官方文档学习笔记：Tutorial: Part 2</title><link>http://www.blogjava.net/Man/archive/2013/05/10/397477.html</link><dc:creator>此号已被删</dc:creator><author>此号已被删</author><pubDate>Fri, 10 May 2013 07:35:00 GMT</pubDate><guid>http://www.blogjava.net/Man/archive/2013/05/10/397477.html</guid><wfw:comment>http://www.blogjava.net/Man/comments/397477.html</wfw:comment><comments>http://www.blogjava.net/Man/archive/2013/05/10/397477.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Man/comments/commentRss/397477.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Man/services/trackbacks/397477.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 本章主要是介绍如何利用django的admin site功能，根据定义的models，自动生成可以CRUD的表单页面。<br />&nbsp;&nbsp;&nbsp;<strong> 一、自动生成admin界面</strong><br />&nbsp;&nbsp;&nbsp; 1、激活admin site功能&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 修改"<span style="background-color: #99cc00;">mysite/settings.py</span>"文件，在INSTALLED_APPS属性去掉'django.contrib.admin'注释。<br /><div>&nbsp;&nbsp;&nbsp; 修改"<span style="background-color: #99cc00;">mysite/urls.py</span>"文件，去掉如下三行的注释：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.contrib&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;admin<br />admin.autodiscover()<br /><br />url(r</span><span style="color: #800000; ">'</span><span style="color: #800000; ">^admin/</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;include(admin.site.urls)),</span></div></div>&nbsp;&nbsp;&nbsp; 执行&#8220;<strong>python manage.py syncdb</strong>&#8221;命令将该模块映射到数据库即可。<br /><br />&nbsp;&nbsp;&nbsp; 2、启动开发服务器&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 运行&#8220;<strong>python manage.py runserver</strong>&#8221;启动server（默认8000端口，端口有冲突重新制定，上篇提到过的）。<br /><div>&nbsp;&nbsp;&nbsp; 启动成功后，即可以浏览器打开&#8220;http://127.0.0.1:8000/admin&#8221;，用之前创建的super user账户登录了。<br />&nbsp;&nbsp;&nbsp; 默认还看不到polls，需要把它注册到admin中。<br />&nbsp;&nbsp;&nbsp; 在&#8220;mysite/polls&#8221;目录下创建admin.py文件，内容如下：<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.contrib&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;admin<br /></span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;polls.models&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;Poll<br /><br />admin.site.register(Poll)</span></div>&nbsp;&nbsp;&nbsp; 重启服务器登录，就可以看到根据Poll模板自动生成的CRUD表单了。<br /><br />&nbsp;&nbsp;&nbsp; 3、自定义admin表单<br />&nbsp;&nbsp;&nbsp; 多个属性时，如何控制各属性显示时的先后关系？<br />&nbsp;&nbsp;&nbsp; 通过修改admin.py,来定义表单显示的格式.<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;django.contrib&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;admin<br /></span><span style="color: #0000FF; ">from</span><span style="color: #000000; ">&nbsp;polls.models&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;Poll,&nbsp;Choice<br /><br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ChoiceInline(admin.TabularInline):</span><span style="color: #008000; "> #</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp; admin.StackedInline<br /></span><span style="color: #000000; "></span><span style="color: #000000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp; model&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Choice<br />&nbsp;&nbsp;&nbsp;&nbsp;extra&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;PollAdmin(admin.ModelAdmin):<br /></span><span style="color: #008000; ">#</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;fields&nbsp;=&nbsp;['pub_date',&nbsp;'question']</span><span style="color: #008000; "><br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;fieldsets&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(None,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="color: #800000; ">'</span><span style="color: #800000; ">fields</span><span style="color: #800000; ">'</span><span style="color: #000000; ">:&nbsp;[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">question</span><span style="color: #800000; ">'</span><span style="color: #000000; ">]}),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Date&nbsp;information</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;&nbsp;&nbsp;&nbsp;{</span><span style="color: #800000; ">'</span><span style="color: #800000; ">fields</span><span style="color: #800000; ">'</span><span style="color: #000000; ">:&nbsp;[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">pub_date</span><span style="color: #800000; ">'</span><span style="color: #000000; ">],&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">classes</span><span style="color: #800000; ">'</span><span style="color: #000000; ">:&nbsp;[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">collapse</span><span style="color: #800000; ">'</span><span style="color: #000000; ">]}),<br />&nbsp;&nbsp;&nbsp;&nbsp;]<br />&nbsp;&nbsp;&nbsp;&nbsp;inlines&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[ChoiceInline]<br />&nbsp;&nbsp;&nbsp;&nbsp;list_display&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">question</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">pub_date</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">was_published_recently</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;list_filter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">pub_date</span><span style="color: #800000; ">'</span><span style="color: #000000; ">]<br />&nbsp;&nbsp;&nbsp;&nbsp;search_fields&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">question</span><span style="color: #800000; ">'</span><span style="color: #000000; ">]<br />&nbsp;&nbsp;&nbsp;&nbsp;date_hierarchy&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">pub_date</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br /><br />admin.site.register(Poll,&nbsp;PollAdmin)<br />admin.site.register(Choice)</span></div>&nbsp;&nbsp;&nbsp; 属性比较少时,直接通过<span>"fields&nbsp;=&nbsp;['pub_date',&nbsp;'question']</span><span>"</span>来<span>确定先后顺序即可.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp; 而属性比较多时,则可通过设置<strong>fieldsets</strong>来制定显示效果.<br />&nbsp;&nbsp;&nbsp; 效果如下图:<br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/man/poll_detail.jpg" height="316" width="900" /><br />&nbsp;&nbsp;&nbsp; Poll表单：<br />&nbsp;&nbsp;&nbsp; <span style="color: #800000;">'</span><span style="color: #800000; ">Date&nbsp;information</span><span style="color: #800000; ">'</span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 新表单标题;<br />&nbsp;&nbsp;&nbsp; <span style="color: #800000;">'</span><span style="color: #800000; ">collapse</span><span style="color: #800000; ">'</span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; django自带的隐藏样式;<br />&nbsp;&nbsp;&nbsp; &#8220;<span style="color: #000000; ">inlines&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[ChoiceInline]</span>&#8221;&nbsp;&nbsp; 将Choice表单显示在Poll中;<br /><div>&nbsp;&nbsp;&nbsp; admin.StackedInline&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; Choice属性垂直显示;<br /><div>&nbsp;&nbsp;&nbsp; <span style="color: #000000; ">admin.TabularInline</span>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Choice属性水平显示;</div>&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; Poll list记录：<br /><img alt="" src="http://www.blogjava.net/images/blogjava_net/man/poll_list.jpg" height="325" width="900" /></div><div>&nbsp;&nbsp;&nbsp; 修改"<span style="background-color: #99cc00;">mysite/polls/models.py</span>"文件，设置相关属性的显示样式。<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Poll(models.Model):<br />&nbsp;&nbsp;&nbsp;&nbsp;question&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;models.CharField(max_length</span><span style="color: #000000; ">=</span><span style="color: #000000; ">200</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;pub_date&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;models.DateTimeField(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">date&nbsp;published</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800080; ">__unicode__</span><span style="color: #000000; ">(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;self.question<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">def</span><span style="color: #000000; ">&nbsp;was_published_recently(self):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;self.pub_date&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;timezone.now()&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;datetime.timedelta(days</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;was_published_recently.admin_order_field&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">pub_date</span><span style="color: #800000; ">'</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;was_published_recently.boolean&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;True<br />&nbsp;&nbsp;&nbsp;&nbsp;was_published_recently.short_description&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">Published&nbsp;recently?</span><span style="color: #800000; ">'</span></div><br />&nbsp;&nbsp;&nbsp; <span style="color: #000000; ">list_display&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #800000; ">'</span><span style="color: #800000; ">question</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">pub_date</span><span style="color: #800000; ">'</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #800000; ">'</span><span style="color: #800000; ">was_published_recently</span><span style="color: #800000; ">'</span><span style="color: #000000; ">)&nbsp; 指定poll list记录页面显示那些字段<br />&nbsp;&nbsp;&nbsp;&nbsp;list_filter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">pub_date</span><span style="color: #800000; ">'</span><span style="color: #000000; ">]&nbsp;&nbsp;&nbsp; 右侧的过滤器；django自带日期选项<br />&nbsp;&nbsp;&nbsp;&nbsp;search_fields&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;[</span><span style="color: #800000; ">'</span><span style="color: #800000; ">question</span><span style="color: #800000; ">'</span><span style="color: #000000; ">]&nbsp;&nbsp;&nbsp; 上端搜索框；制定搜索的属性范围，like匹配<br />&nbsp;&nbsp;&nbsp;&nbsp;date_hierarchy&nbsp;</span><span style="color: #000000; ">=</span>&nbsp;<span style="color: #800000; ">'</span><span style="color: #800000; ">pub_date</span><span style="color: #800000; ">'</span><span style="color: #000000; ">&nbsp;&nbsp; 日期分层导航；根据记录日期年月日自动分类<br /><br /></span><strong>&nbsp;&nbsp;&nbsp; 二、自定义admin外观</strong><br /><div>&nbsp;&nbsp;&nbsp; 创建&#8220;mysite/templates&#8221;目录，修改"<span style="background-color: #99cc00;">mysite/settings.py</span>"文件，在TEMPLATE_DIRS属性中配置该目录位置。<br />&nbsp;&nbsp;&nbsp; 进入django安装目录（...\Python27\Lib\site-packages\django\contrib\admin\templates），把你需要修改的文件，拷贝到项目&#8220;mysite/templates&#8221;目录下，修改成你需要的效果，服务器启动时会自动从此处加载。<br />&nbsp;&nbsp;&nbsp;</div></div></div><img src ="http://www.blogjava.net/Man/aggbug/397477.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Man/" target="_blank">此号已被删</a> 2013-05-10 15:35 <a href="http://www.blogjava.net/Man/archive/2013/05/10/397477.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>git push到windows下的服务器失败</title><link>http://www.blogjava.net/Man/archive/2013/04/15/397880.html</link><dc:creator>此号已被删</dc:creator><author>此号已被删</author><pubDate>Mon, 15 Apr 2013 12:31:00 GMT</pubDate><guid>http://www.blogjava.net/Man/archive/2013/04/15/397880.html</guid><wfw:comment>http://www.blogjava.net/Man/comments/397880.html</wfw:comment><comments>http://www.blogjava.net/Man/archive/2013/04/15/397880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Man/comments/commentRss/397880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Man/services/trackbacks/397880.html</trackback:ping><description><![CDATA[在windows下搭了个服务器学习git。push时出现如下异常：<br /><div><code plain"="">&#8220;git clone git@127.0.0.1:/home/git/repositories/gitosis-admin.git&#8221;</code></div><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">git</span><span style="color: #000000; ">.</span><span style="color: #000000; ">exe&nbsp;</span><span style="color: #0000FF; ">push</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">force&nbsp;</span><span style="color: #000000; ">--</span><span style="color: #000000; ">progress&nbsp;&nbsp;</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; font-weight: bold; ">origin</span><span style="color: #000000; font-weight: bold; ">"</span><span style="color: #000000; ">&nbsp;master</span><span style="color: #000000; ">:</span><span style="color: #000000; ">master<br />&nbsp;<br />Counting&nbsp;objects</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">189</span><span style="color: #000000; ">,</span><span style="color: #000000; ">&nbsp;done</span><span style="color: #000000; ">.</span><span style="color: #000000; "><br />Compressing&nbsp;objects</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;</span><span style="color: #800000; ">100</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #800000; ">187</span><span style="color: #000000; ">/</span><span style="color: #800000; ">187</span><span style="color: #000000; ">)<br />Writing&nbsp;objects</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #800000; ">7</span><span style="color: #000000; ">%</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #800000; ">14</span><span style="color: #000000; ">/</span><span style="color: #800000; ">189</span><span style="color: #000000; ">)<br />fatal</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;Unable&nbsp;to&nbsp;create&nbsp;temporary&nbsp;file</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;Permission&nbsp;denied<br />fatal</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;sha1&nbsp;file&nbsp;</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; ">&lt;stdout&gt;</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">write</span><span style="color: #000000; ">&nbsp;error</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;Invalid&nbsp;argument<br />error</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;failed&nbsp;to&nbsp;</span><span style="color: #0000FF; ">push</span><span style="color: #000000; ">&nbsp;some&nbsp;refs&nbsp;to&nbsp;</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; font-weight: bold; ">git@10.73.4.46:channelv.git</span><span style="color: #000000; font-weight: bold; ">'</span><span style="color: #000000; "><br />&nbsp;<br />git&nbsp;did&nbsp;not&nbsp;</span><span style="color: #0000FF; ">exit</span><span style="color: #000000; ">&nbsp;cleanly&nbsp;(</span><span style="color: #0000FF; ">exit</span><span style="color: #000000; ">&nbsp;code&nbsp;</span><span style="color: #800000; ">1</span><span style="color: #000000; ">)</span></div><br />原因是因为创建用来登陆ssh的用户git，没有修改版本库的权限。即给gitosis-admin.git文件夹，加上git用户的修改权限即可。（"chown -R git *"）<br /><img src ="http://www.blogjava.net/Man/aggbug/397880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Man/" target="_blank">此号已被删</a> 2013-04-15 20:31 <a href="http://www.blogjava.net/Man/archive/2013/04/15/397880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Django官方文档学习笔记：Tutorial: Part 1 </title><link>http://www.blogjava.net/Man/archive/2013/04/07/397311.html</link><dc:creator>此号已被删</dc:creator><author>此号已被删</author><pubDate>Sun, 07 Apr 2013 10:35:00 GMT</pubDate><guid>http://www.blogjava.net/Man/archive/2013/04/07/397311.html</guid><wfw:comment>http://www.blogjava.net/Man/comments/397311.html</wfw:comment><comments>http://www.blogjava.net/Man/archive/2013/04/07/397311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Man/comments/commentRss/397311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Man/services/trackbacks/397311.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/Man/archive/2013/04/07/397311.html'>阅读全文</a><img src ="http://www.blogjava.net/Man/aggbug/397311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Man/" target="_blank">此号已被删</a> 2013-04-07 18:35 <a href="http://www.blogjava.net/Man/archive/2013/04/07/397311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cygwin的ssh服务使用公钥登录</title><link>http://www.blogjava.net/Man/archive/2013/03/12/396334.html</link><dc:creator>此号已被删</dc:creator><author>此号已被删</author><pubDate>Tue, 12 Mar 2013 09:17:00 GMT</pubDate><guid>http://www.blogjava.net/Man/archive/2013/03/12/396334.html</guid><wfw:comment>http://www.blogjava.net/Man/comments/396334.html</wfw:comment><comments>http://www.blogjava.net/Man/archive/2013/03/12/396334.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Man/comments/commentRss/396334.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Man/services/trackbacks/396334.html</trackback:ping><description><![CDATA[<div><code><p style="line-height: 150%; margin: 5px;">&nbsp;&nbsp;&nbsp; 前面已经讲过如何在windows下利用cygwin搭建ssh服务，但是使用账户密码的验证登录模式比较麻烦，尤其是在它作为多人访问的服务的时候。</p><p style="line-height: 150%; margin: 5px;"><br /></p><p style="line-height: 150%; margin: 5px;">&nbsp;&nbsp;&nbsp; 下面讲一下如何使用公钥认证的方式来登录。</p><p style="line-height: 150%; margin: 5px;"><br /></p><p style="line-height: 150%; margin: 5px;">&nbsp;&nbsp;&nbsp; 网上这一类的文章很多，但putty来登录时要注意个问题，puttygen生成的公钥私钥是不能被ssh识别。得使用ssh-keygen命令来创建钥匙对。（之前也按照网上的教程使用puttygen来生成key，浪费了好多时间）<br /></p><p style="line-height: 150%; margin: 5px;"><br /></p><div><code>1.创建密钥对：<br /></code>&nbsp;&nbsp;&nbsp; <code>$ ssh-keygen -t rsa<br /></code>&nbsp;&nbsp;&nbsp; <code>一路回车即可！</code></div><p style="line-height: 150%; margin: 5px;">&nbsp;&nbsp;&nbsp; 中间有提示是否给私钥加密，这个看个人喜欢。下面命令则是修改私钥密码。</p><p style="line-height: 150%; margin: 5px;">&nbsp;&nbsp;&nbsp; 例：私钥文件是/cygdrive/d/id_rsa,把它新密码重置为空，执行后会提示输入旧密码验证。<br /></p><div><pre>&nbsp;&nbsp;&nbsp; <code>$ ssh-keygen -p -f /cygdrive/d/id_rsa -N ''</code><br /><br />2.密钥设置：<br />&nbsp;&nbsp;&nbsp; $ cd /home/username/<br />&nbsp;&nbsp;&nbsp; $ mkdir .ssh &amp;&amp; chmod 700 .ssh<br />&nbsp;&nbsp;&nbsp; $ cd .ssh/<br />&nbsp;&nbsp;&nbsp; $ cat /cygdrive/d/id_rsa &gt; authorized_keys&nbsp;&nbsp;（将公钥放置其中）<br />&nbsp;&nbsp;&nbsp; $ chmod 600 authorized_keys</pre></div> <p style="line-height: 150%; margin: 5px;">3./etc/sshd_config配置</p><p style="line-height: 150%; margin: 5px;">&nbsp;&nbsp;&nbsp; 要把下面这几项的注释去掉，并对应值改为如下内容：<br /></p><p style="line-height: 150%; margin: 5px;"></p><div>&nbsp;&nbsp;&nbsp; StrictModes no</div><div>&nbsp;&nbsp;&nbsp; PubkeyAuthentication yes</div><div>&nbsp;&nbsp;&nbsp; AuthorizedKeysFile&nbsp;&nbsp; &nbsp;.ssh/authorized_keys<br /><br />&nbsp;&nbsp;&nbsp; 改完后要重启ssh服务才能生效。</div><p>&nbsp;</p><p style="line-height: 150%; margin: 5px;"><br /></p><p style="line-height: 150%; margin: 5px;">4.本机用bash命令行登录测试一下：</p><div>&nbsp;&nbsp;&nbsp; ssh -i /cygdrive/d/id_rsa username@127.0.0.1<br /><br />&nbsp;&nbsp;&nbsp; 加个-v参数则看到具体调试信息，无法正常登录时可以调试下<br /><div><code><div>&nbsp;&nbsp;&nbsp; ssh -v -i /cygdrive/d/.ssh/id_rsa git@127.0.0.1<br /><br />&nbsp;&nbsp;&nbsp; 使用putty登录的话，则需要先把该私钥转换成它兼容的格式。<br />&nbsp;&nbsp;&nbsp; 使用puttygen导入私钥，再点&#8220;Save private key&#8221;即生成它兼容的私钥文件了。</div></code></div></div></code></div><img src ="http://www.blogjava.net/Man/aggbug/396334.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Man/" target="_blank">此号已被删</a> 2013-03-12 17:17 <a href="http://www.blogjava.net/Man/archive/2013/03/12/396334.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ReviewBoard上传图片异常</title><link>http://www.blogjava.net/Man/archive/2013/02/26/395760.html</link><dc:creator>此号已被删</dc:creator><author>此号已被删</author><pubDate>Tue, 26 Feb 2013 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/Man/archive/2013/02/26/395760.html</guid><wfw:comment>http://www.blogjava.net/Man/comments/395760.html</wfw:comment><comments>http://www.blogjava.net/Man/archive/2013/02/26/395760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Man/comments/commentRss/395760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Man/services/trackbacks/395760.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 解决Python在windows下处理图片时的异常：<br><br>“The _imaging C module is not installed”&nbsp;&nbsp;<a href='http://www.blogjava.net/Man/archive/2013/02/26/395760.html'>阅读全文</a><img src ="http://www.blogjava.net/Man/aggbug/395760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Man/" target="_blank">此号已被删</a> 2013-02-26 16:27 <a href="http://www.blogjava.net/Man/archive/2013/02/26/395760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>