<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[vkill'blog]]></title> 
<link>http://blog.vkill.net/index.php</link> 
<description><![CDATA[“技术本身没有太多价值，掌握了新的思考方式才是真的收获”]]></description> 
<language>en-US</language> 
<copyright><![CDATA[vkill'blog]]></copyright>
<item>
<link>http://blog.vkill.net/read.php/216.htm</link>
<title><![CDATA[generate offline rails api rdoc (like api.rubyonrails.org) and guides html (like guides.rubyonrails.org)]]></title> 
<author>vkill &lt;vkill.net@gmail.com&gt;</author>
<category><![CDATA[ruby &amp; rails]]></category>
<pubDate>Mon, 5 Dec 2011 08:37:16 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/216.htm</guid> 
<description>
<![CDATA[ 
	每次查api都在线，比较慢，所以生成下，离线来看，效果还好<br/><br/>First<br/><div class="code"><br/>gem i RedCloth<br/>gem i sdoc<br/></div><br/><br/>Then<br/><div class="code"><br/>git clone git://github.com/rails/rails.git<br/>cd rails<br/>git checkout origin/3-1-stable -b 3-1-stable<br/></div><br/><br/>generate rails api rdoc<br/><div class="code"><br/>rake rdoc<br/>#注：如果出现错误 undefined local variable or method `basedir&#039; for #&lt;RDoc::Generator::SDoc<br/>#解决办法 注释 rails/Rakefile 中的 rdoc.options &lt;&lt; &#039;-g&#039;<br/>open doc/rdoc/index.html<br/></div><br/>或<br/><div class="code"><br/>sdoc -N rails<br/>#注：这个会生成所有文件的 rdoc，导航看起来有点乱感觉<br/>open doc/index.html<br/></div><br/><br/>generate guides html<br/><div class="code"><br/>cd railties<br/>rake generate_guides #or ruby guides/rails_guides.rb<br/>open guides/output/index.html<br/></div><br/><br/><br/>后记：<br/>rbuy 1.9.2 的 rdoc，可以到这里下载 http://railsapi.com/<br/><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/api/" rel="tag">api</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/215.htm</link>
<title><![CDATA[ruby gem 中使用 Struct 定义 Configuration 的方法]]></title> 
<author>vkill &lt;vkill.net@gmail.com&gt;</author>
<category><![CDATA[ruby &amp; rails]]></category>
<pubDate>Mon, 14 Nov 2011 07:50:51 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/215.htm</guid> 
<description>
<![CDATA[ 
	写gem的时候常需要定义一些configuration，这个configuration是可以让用户自己重定义的，方法很多，这里说的是用 Struct ，这样的代码是最少的，很值得用<br/>例子如下，lib/my_gem.rb<br/><div class="code"><br/>#encoding: utf-8<br/>module MyGem<br/>&nbsp;&nbsp;Configuration = Struct.new(:a, :b, :c).new(3,nil,4)<br/>&nbsp;&nbsp;def self.configure<br/>&nbsp;&nbsp;&nbsp;&nbsp;yield Configuration<br/>&nbsp;&nbsp;end<br/>end<br/>p MyGem::Configuration.a<br/>MyGem.configure do &#124;config&#124;<br/>&nbsp;&nbsp;config.a = 2<br/>&nbsp;&nbsp;config.b = 3<br/>end<br/>MyGem::Configuration.each_pair &#123;&#124;k,v&#124; puts(&quot;#&#123;k&#125;&quot; =&gt; &quot;#&#123;v&#125;&quot;)&#125;<br/><br/></div><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">代码学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/rails%25E6%258F%2592%25E4%25BB%25B6/" rel="tag">rails插件</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/214.htm</link>
<title><![CDATA[archlinux 使用 中为 U600 无线上网卡]]></title> 
<author>vkill &lt;vkill.net@gmail.com&gt;</author>
<category><![CDATA[linux system]]></category>
<pubDate>Thu, 3 Nov 2011 05:03:32 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/214.htm</guid> 
<description>
<![CDATA[ 
	一、查看上网卡信息<br/><div class="code"><br/>&#91;root@vkill-arch ~&#93;# pacman -S usbutils<br/></div><br/>插入上网卡前后比对，我的信息如下<br/><div class="code"><br/>&#91;root@vkill-arch ~&#93;# lsusb<br/>Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub<br/>Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub<br/>Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub<br/>Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub<br/>Bus 001 Device 003: ID 04fc:2801 Sunplus Technology Co., Ltd <br/>Bus 001 Device 004: ID 20b9:1682&nbsp;&nbsp;<br/>Bus 002 Device 003: ID 192f:0916 Avago Technologies, Pte. <br/></div><br/><div class="code"><br/>&#91;root@vkill-arch ~&#93;# lsusb<br/>Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub<br/>Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub<br/>Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub<br/>Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub<br/>Bus 001 Device 003: ID 04fc:2801 Sunplus Technology Co., Ltd <br/>Bus 001 Device 005: ID 05c6:1000 Qualcomm, Inc. Mass Storage Device<br/>Bus 002 Device 003: ID 192f:0916 Avago Technologies, Pte. <br/></div><br/>可以看出 Bus 001 Device 005: ID 05c6:1000 Qualcomm, Inc. Mass Storage Device 这个就是上网卡的信息了<br/>看到上网卡的 idVendor 05c6 和 idProduct 1000，格式是 idVendor:idProduct<br/><br/>二、把上网卡从cd-rom设备转换到modem设备<br/><div class="code"><br/>&#91;root@vkill-arch ~&#93;# pacman -S usb_modeswitch<br/></div><br/>安装好后到/etc/usb_modeswitch.d/目录运行 #head -n 2 * 就可以看到当前版本usb_modeswitch支持的3g上网卡的型号了<br/><div class="code"><br/>&#91;root@vkill-arch ~&#93;# usb_modeswitch -c /etc/usb_modeswitch.setup<br/></div><br/>试试成功不，如果不成功，那么试试这个<br/><div class="code"><br/>&#91;root@vkill-arch ~&#93;# usb_modeswitch -v 05c6 -p 1000 -M 5553424312345678000000000000061b000000020000000000000000000000 -R 1<br/>&#91;root@vkill-arch ~&#93;# modprobe usbserial vendor=0x05c6 product=0x1000<br/>&#91;root@vkill-arch ~&#93;# ls /dev/tty*<br/></div><br/>看能不能看的到ttyUSB0这些，如果有则继续，如果无请另寻它法<br/><br/>三、开始拨号<br/><div class="code"><br/>&#91;root@vkill-arch ~&#93;# pacman -S wvdial<br/></div><br/><div class="code"><br/>&#91;root@vkill-arch ~&#93;# wvdialconf<br/>会自动生成 /etc/wvdial.conf <br/>再添加下面几行进去（电信cdma的例子，电话号码：#777 用户名：ctnet@mycdma.cn(或是card) 密码: vnet.mobi (或是card)）<br/>Phone = #777<br/>Username = ctnet@mycdma.cn<br/>Password = vnet.mobi<br/>Stupid Mode = 1<br/></div><br/><div class="code"><br/>&#91;root@vkill-arch ~&#93;# wvdial<br/></div><br/><br/>参考资料：<br/>http://www.linuxsir.org/bbs/showthread.php?t=352115<br/>http://groups.google.com/group/hzlug/browse_thread/thread/95a3b678673f3d8e<br/>https://wiki.archlinux.org/index.php/USB_3G_Modem<br/>https://wiki.archlinux.org/index.php/Wvdial<br/><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/archlinux/" rel="tag">archlinux</a> , <a href="http://blog.vkill.net/go.php/tags/%25E6%2580%259D%25E8%25B7%25AF/" rel="tag">思路</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25B8%258A%25E7%25BD%2591%25E5%258D%25A1/" rel="tag">上网卡</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/213.htm</link>
<title><![CDATA[使用 rails_kindeditor 0.1.0 上传本地图片后 session 丢失的解决方法]]></title> 
<author>vkill &lt;vkill.net@gmail.com&gt;</author>
<category><![CDATA[ruby &amp; rails]]></category>
<pubDate>Sun, 18 Sep 2011 17:24:42 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/213.htm</guid> 
<description>
<![CDATA[ 
	rails_kindeditor 见这里 https://github.com/Macrow/rails_kindeditor，使用很方便<br/>但是在后台使用的时候每次上传图片就会 session 丢失<br/>看了 post 的参数发现是没有提交 authenticity_token<br/>网上没找到解决方案，没法，只有改js源码了<br/><br/>kindeditor/kindeditor-init.js 是这里定义的 uploadJson: "/kindeditor/upload" ，也就是上传的地址，本想在后面加 ?authenticity_token=xxxx 这样的<br/>但是后面的 kindeditor/plugins/image/image.js 里这样使用了 url : uploadJson + '?dir=image' ,<br/>那么只有改 kindeditor/plugins/image/image.js 了，改成下面这样就ok了<br/><div class="code"><br/>#kindeditor/plugins/image/image.js<br/>url : uploadJson + &#039;?dir=image&#039; + &quot;&amp;&quot; + encodeURIComponent($(&quot;&#91;name=&#039;csrf-param&#039;&#93;&quot;).attr(&quot;content&quot;)) + &quot;=&quot; + encodeURIComponent($(&quot;&#91;name=&#039;csrf-token&#039;&#93;&quot;).attr(&quot;content&quot;)),<br/></div><br/><br/>ok，就这样解决就好，rails_kindeditor 这个定义 uploadJson 不怎么好，要是定义成 uploadJson: "/kindeditor/upload?" ,image.js 中这样使用 url : uploadJson + '&dir=image' ，这样就好扩展多了<br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%259B%25BE%25E7%2589%2587%25E5%25A4%2584%25E7%2590%2586/" rel="tag">图片处理</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25B8%258A%25E4%25BC%25A0/" rel="tag">上传</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/rails%25E6%258F%2592%25E4%25BB%25B6/" rel="tag">rails插件</a> , <a href="http://blog.vkill.net/go.php/tags/paperclip/" rel="tag">paperclip</a> , <a href="http://blog.vkill.net/go.php/tags/%25E6%2580%259D%25E8%25B7%25AF/" rel="tag">思路</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/212.htm</link>
<title><![CDATA[利用 resque-status 使客户端获得 resque job status ]]></title> 
<author>vkill &lt;vkill.net@gmail.com&gt;</author>
<category><![CDATA[ruby &amp; rails]]></category>
<pubDate>Sat, 10 Sep 2011 13:49:37 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/212.htm</guid> 
<description>
<![CDATA[ 
	比如我们登录成功的时候要执行一些 background jobs，那这里可能就会用 resque，那么有个问题就是登录成功后如何得知那些 background jobs 的状态呢？ resque-status 这个gem就可以搞定了<br/><br/>先看下面的代码<br/><div class="code"><br/>require &#039;rubygems&#039;<br/>require &#039;pry&#039;<br/>require &#039;resque&#039;<br/><br/>Resque.redis = &#039;localhost:6379&#039;<br/>Resque.redis.namespace = &quot;resque:vkill.net&quot;<br/><br/>require &#039;resque/job_with_status&#039;<br/>Resque::Status.expire_in = (24 * 60 * 60)<br/><br/>class SleepJob &lt; Resque::JobWithStatus<br/>&nbsp;&nbsp;def perform<br/>&nbsp;&nbsp;&nbsp;&nbsp;total = options&#91;&#039;length&#039;&#93;.to_i &#124;&#124; 1000<br/>&nbsp;&nbsp;&nbsp;&nbsp;num = 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;while num &lt; total<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;at(num, total, &quot;At #&#123;num&#125; of #&#123;total&#125;&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num += 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;end<br/>&nbsp;&nbsp;&nbsp;&nbsp;completed<br/>&nbsp;&nbsp;end<br/>end<br/><br/>job_id = SleepJob.create(:length =&gt; 100)<br/>status = Resque::Status.get(job_id)<br/>binding.pry<br/><br/>=begin<br/><br/>&#91;root@vkill-arch ~&#93;# ruby resque-status_demo.rb<br/><br/>From: resque-status_demo.rb @ line 27 in Object#N/A:<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;22:&nbsp;&nbsp; end<br/>&nbsp;&nbsp;&nbsp;&nbsp;23: end<br/>&nbsp;&nbsp;&nbsp;&nbsp;24:<br/>&nbsp;&nbsp;&nbsp;&nbsp;25: job_id = SleepJob.create(:length =&gt; 100)<br/>&nbsp;&nbsp;&nbsp;&nbsp;26: status = Resque::Status.get(job_id)<br/> =&gt; 27: binding.pry<br/>&nbsp;&nbsp;&nbsp;&nbsp;28:<br/>pry(main)&gt; job_id<br/>=&gt; &quot;60c3b710bdba012e7b916c55f9208b32&quot;<br/>pry(main)&gt; Resque::Status.status_ids<br/>=&gt; &#91;&quot;60c3b710bdba012e7b916c55f9208b32&quot;,<br/> &quot;61858fb0bdb9012e7b906c55f9208b32&quot;,<br/> &quot;3b377730bdb9012e7b8f6c55f9208b32&quot;&#93;<br/><br/>=end<br/><br/></div><br/><br/>通过上面代码就可以理出思路， 登录成功后 执行 job，并把 job_id 存储在服务器端，然后把 job_id 返回给浏览器，浏览器就可以ajax 循环请求服务器来得知backgroud jobs 的执行情况了<br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/javascript/" rel="tag">javascript</a> , <a href="http://blog.vkill.net/go.php/tags/%25E6%2580%259D%25E8%25B7%25AF/" rel="tag">思路</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/211.htm</link>
<title><![CDATA[django 中 改变 request.POST 、request.GET 和 request.META]]></title> 
<author>vkill &lt;vkill.net@gmail.com&gt;</author>
<category><![CDATA[python &amp; django]]></category>
<pubDate>Fri, 26 Aug 2011 03:46:09 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/211.htm</guid> 
<description>
<![CDATA[ 
	django 的 request.POST 这些不能直接来添加，可以copy 后 edit 然后再 replace 就ok了，这里要注意的是 request.REQUEST 不能这样改，下面是我写的实例方法来改的代码 <br/><br/><div class="code"><br/>&nbsp;&nbsp;&nbsp;&nbsp;def update_request_GET(self, data=&#123;&#125;):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;self.request.method in (&quot;GET&quot;):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_PARAMS = self.request.GET.copy()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_PARAMS = self.request.POST.copy()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for k,v in data.items():<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_PARAMS&#91;k&#93; = v<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;&nbsp;self.request.method in (&quot;GET&quot;):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.request.GET = new_PARAMS<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.request.POST = new_PARAMS<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.request.PARAMS = new_PARAMS<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return self.request<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;def update_request_POST(self, data=&#123;&#125;):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return self.update_request_GET(data)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;def update_request_META(self, data=&#123;&#125;):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_META = self.request.META.copy()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for k,v in data.items():<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_META&#91;k&#93; = v<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.request.META = new_META<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return self.request<br/></div><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E6%2580%259D%25E8%25B7%25AF/" rel="tag">思路</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/210.htm</link>
<title><![CDATA[django 中使用 tag 来完善分页视图中的 上一页、下一页 ]]></title> 
<author>vkill &lt;vkill.net@gmail.com&gt;</author>
<category><![CDATA[python &amp; django]]></category>
<pubDate>Fri, 5 Aug 2011 10:39:13 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/210.htm</guid> 
<description>
<![CDATA[ 
	关于分页视图中使用分页栏google很多文章，讲到的方法中，如果地址栏中有 ?a=1 这样的querystring，那么就很不好办，这里自己写了个tag来处理了下，没这个问题了<br/>bs 下，django的template太烂的，解决这么个简单问题还需要写那么长个tag，实在不爽中。。。<br/><br/>tag如下：<br/><div class="code"><br/>#app_xx/templatetags/add_page_to_path_tag.py<br/>from django.template import Library, Node, TemplateSyntaxError<br/>from urlparse import urlparse, urlunparse<br/>import re<br/><br/>register = Library()<br/><br/>class AddPageToPathNode(Node):<br/>&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self, request, page):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._request = request.encode()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._page = page.encode()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;def render(self, context):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.full_path = context&#91;self._request&#93;.get_full_path()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self._page == &#039;first&#039;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.page = 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif self._page == &#039;last&#039;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.page = context&#91;&#039;pages&#039;&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.page = context&#91;self._page&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url = urlparse(self.full_path)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1 = re.compile(r&quot;&#92;?&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2 = re.compile(r&quot;page=&#92;d+&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if r1.search(self.full_path):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if r2.search(self.full_path):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return r2.sub(&#039;page=%s&#039; % self.page, urlunparse(url))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &quot;%s&amp;page=%s&quot; % (self.full_path, self.page)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &quot;%s?page=%s&quot; % (self.full_path, self.page)<br/><br/>def add_page_to_path(parser, token):<br/>&nbsp;&nbsp;&nbsp;&nbsp;tokens = token.split_contents()<br/>&nbsp;&nbsp;&nbsp;&nbsp;if len(tokens) &lt; 3:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise TemplateSyntaxError(u&quot;&#039;%r&#039; tag requires at least 2 arguments.&quot; % tokens&#91;0&#93;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;return AddPageToPathNode(tokens&#91;1&#93;, tokens&#91;2&#93;)<br/><br/>register.tag(&#039;add_page_to_path&#039;, add_page_to_path)<br/></div><br/><br/><br/>template中使用如下：<br/><div class="code"><br/>#app_xx/templates/include/paginate.html<br/>&#123;% load add_page_to_path_tag %&#125;<br/><br/>&lt;div style=&quot;text-align:right; padding-right: 20px&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;% if is_paginated %&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;% ifequal page 1 %&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首页<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;% else %&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;a href=&quot;&#123;% add_page_to_path request first %&#125;&quot;&gt;首页&lt;/a&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;% endifequal %&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;% if has_previous %&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href=&quot;&#123;% add_page_to_path request previous %&#125;&quot;&gt;上一页&lt;/a&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;% else %&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上一页<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;% endif %&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;% if has_next %&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href=&quot;&#123;% add_page_to_path request next %&#125;&quot;&gt;下一页&lt;/a&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;% else %&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下一页<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;% endif %&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;% ifequal page pages %&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;末页<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;% else %&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href=&quot;&#123;% add_page_to_path request pages %&#125;&quot;&gt;末页&lt;/a&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#123;% endifequal %&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&amp;nbsp;当前页：&#123;&#123; page &#125;&#125;/&#123;&#123; pages &#125;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;% endif %&#125;<br/>&lt;/div&gt;<br/></div><br/><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/%25E6%2580%259D%25E8%25B7%25AF/" rel="tag">思路</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/209.htm</link>
<title><![CDATA[django 中使用form实现 类 meta_search 的 search功能]]></title> 
<author>vkill &lt;vkill.net@gmail.com&gt;</author>
<category><![CDATA[python &amp; django]]></category>
<pubDate>Fri, 5 Aug 2011 10:26:48 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/209.htm</guid> 
<description>
<![CDATA[ 
	rails 中用惯了 meta_search， django下貌似没这样的包，就自己用form大概实现了下，基本上能满足需求，就是使用很局限，只能用于单个的资源<br/><br/>form中<br/><div class="code"><br/>#search_order_form.py<br/>#encoding: utf-8<br/>from app_ticket.forms.base_form import *<br/>from datetime import datetime<br/><br/>class SearchOrderForm(Form):<br/>&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self, *args, **kwargs):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(self.__class__, self).__init__(*args, **kwargs)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.prefix = &#039;search&#039;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;state = forms.MultipleChoiceField(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required=False, label=u&#039;状态&#039;, initial=&#039;&#039;, help_text=&#039;&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error_messages=&#123;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;choices=Order.ORDER_STATE_CHOICES,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;widget=forms.CheckboxSelectMultiple(&#123;&#039;class&#039;: &#039;checkbox&#039;&#125;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;web_order_id = forms.CharField(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required=False, label=u&#039;订单号&#039;, initial=&#039;&#039;, help_text=&#039;&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error_messages=&#123;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;widget=forms.TextInput()<br/>&nbsp;&nbsp;&nbsp;&nbsp;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;start_time = forms.DateTimeField(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required=False, label=u&#039;创建时间(开始)&#039;, initial=&#039;&#039;, help_text=&#039;&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error_messages=&#123;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;widget=forms.DateTimeInput(&#123;&#039;data-date_select_start&#039;:1&#125;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;end_time = forms.DateTimeField(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required=False, label=u&#039;创建时间(结束)&#039;, initial=&#039;&#039;, help_text=&#039;&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;error_messages=&#123;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;widget=forms.DateTimeInput(&#123;&#039;data-date_select_end&#039;:1&#125;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;)<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;def search(self):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = &#039;&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.data.has_key(&#039;%s-state&#039; % self.prefix):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;states = self.data.getlist(&#039;%s-state&#039; % self.prefix)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if states.__len__() &gt; 0:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = &quot;%s__in=%s,%s&quot; % (&#039;state&#039;, states, q)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;web_order_id = self.data.get(&#039;%s-web_order_id&#039; % self.prefix, None)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if web_order_id:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = &quot;%s__icontains=&#039;%s&#039;,%s&quot; % (&#039;web_order_id&#039;, web_order_id, q)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_time = self.data.get(&#039;%s-start_time&#039; % self.prefix, None)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if start_time:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = &quot;%s__gte=&#039;%s&#039;,%s&quot; % (&#039;created_at&#039;, start_time, q)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end_time = self.data.get(&#039;%s-end_time&#039; % self.prefix, None)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if end_time:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q = &quot;%s__lte=&#039;%s&#039;,%s&quot; % (&#039;created_at&#039;, end_time, q)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return q<br/></div><br/><br/><br/>view中<br/><div class="code"><br/># encoding: utf-8<br/>from app_ticket.views_ext.admin.admin_base_views import *<br/>from app_ticket.models import Order<br/>from app_ticket.forms.search_order_form import SearchOrderForm<br/><br/>class AdminOrdersViews(AdminBaseViews):<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.search = None<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;def index(self, request, *args, **kwargs):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.search_form = SearchOrderForm(self.request.REQUEST)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.search_form.is_valid():<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.search = self.search_form.search()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__collection()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return self.object_list(self.collection, &#039;admin/orders/index.html&#039;,8)<br/><br/>######################################################################<br/>&nbsp;&nbsp;&nbsp;&nbsp;def __collection_queryset(self, *args, **kwargs):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._collection_queryset = Order.objects.reverse()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.search:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self._collection_queryset = eval(&quot;self._collection_queryset.filter(%s)&quot; % self.search)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return self._collection_queryset<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;def __collection(self, *args, **kwargs):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.collection = self.orders = self.__collection_queryset().select_related()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return self.collection<br/></div><br/><br/>那么就可以这样使用了，这里可以使用 get ，也可以使用 post，不过index一般都是使用get<br/><div class="code"><br/>http://192.168.1.113/orders/index?search-state=pending<br/></div><br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/model/" rel="tag">model</a> , <a href="http://blog.vkill.net/go.php/tags/orm/" rel="tag">orm</a> , <a href="http://blog.vkill.net/go.php/tags/%25E6%2580%259D%25E8%25B7%25AF/" rel="tag">思路</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/208.htm</link>
<title><![CDATA[django 配置 url 使之支持 类rails 的 format 形式]]></title> 
<author>vkill &lt;vkill.net@gmail.com&gt;</author>
<category><![CDATA[python &amp; django]]></category>
<pubDate>Tue, 19 Jul 2011 04:37:19 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/208.htm</guid> 
<description>
<![CDATA[ 
	django 的 url 比较 lj ，都不支持 format ，改写下url ，使之支持<br/>直接上代码<br/><br/>url.conf 中这样写<br/><div class="code"><br/>from django.http import HttpResponseRedirect<br/>url(r&#039;^users$&#039;,lambda x: HttpResponseRedirect(reverse(&#039;users_index&#039;))),<br/>url(r&#039;^users/index$&#039;,UsersViews.base, &#123;&#039;action&#039;:&#039;index&#039;&#125;, name=&#039;users_index&#039;),<br/>url(r&#039;^users/index(?P&lt;format&gt;&#92;.&#92;w+)$&#039;,UsersViews.base, &#123;&#039;action&#039;:&#039;index&#039;&#125;, name=&#039;users_index&#039;),<br/></div><br/><br/>view 中这样使用<br/><div class="code"><br/>reverse(&#039;users_index&#039;)<br/>reverse(&#039;users_index&#039;, kwargs=&#123;&quot;format&quot;: &quot;.json&quot;&#125;)<br/></div><br/><br/>template 中这样使用<br/><div class="code"><br/>&#123;% url users_index %&#125;<br/>&#123;% url users_index &quot;.json&quot; %&#125;<br/></div><br/><br/>浏览器地址栏中<br/><div class="code"><br/>/users/index<br/>/users/index.json<br/></div><br/><br/>好了，这样就可以实现根据传递的参数来决定使用哪个 url 了<br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/%25E6%2580%259D%25E8%25B7%25AF/" rel="tag">思路</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a> , <a href="http://blog.vkill.net/go.php/tags/%25E6%25AD%25A3%25E5%2588%2599/" rel="tag">正则</a>
]]>
</description>
</item><item>
<link>http://blog.vkill.net/read.php/207.htm</link>
<title><![CDATA[django update permissions on use manage.py syncdb]]></title> 
<author>vkill &lt;vkill.net@gmail.com&gt;</author>
<category><![CDATA[python &amp; django]]></category>
<pubDate>Wed, 13 Jul 2011 09:09:56 +0000</pubDate> 
<guid>http://blog.vkill.net/read.php/207.htm</guid> 
<description>
<![CDATA[ 
	有时候给某个model加了些 permissions 上去，但是已经 syncdb 生成数据库表了，这样 permissions 就不能自动生成了<br/>那么我们可以写个 post_syncdb 的 signal 来用<br/>代码如下：（注：signal.py 直接丢在 项目根目录下去）<br/><div class="code"><br/>#signal.py<br/>def update_permissions(sender, **kwargs):<br/>&nbsp;&nbsp;&nbsp;&nbsp;import settings<br/>&nbsp;&nbsp;&nbsp;&nbsp;import string<br/>&nbsp;&nbsp;&nbsp;&nbsp;from django.db.models.signals import post_syncdb<br/>&nbsp;&nbsp;&nbsp;&nbsp;for app in settings.INSTALLED_APPS:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exec(&quot;from %s.models import *&quot; % app)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<br/>&nbsp;&nbsp;&nbsp;&nbsp;for content_type in ContentType.objects.all():<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for perm in eval(&quot;%s._meta.permissions&quot; % string.capwords(content_type.name).replace(&quot; &quot;,&#039;&#039;)):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not Permission.objects.filter(content_type=content_type, codename=perm&#91;0&#93;).exists():<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Permission.objects.create(content_type=content_type,<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;codename=perm&#91;0&#93;,<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;name=&quot;%s&quot; % perm&#91;1&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Added &#039;%s&#039; permission for %s&quot; % (perm&#91;0&#93;, content_type.name)<br/>post_syncdb.connect(update_permissions)<br/></div><br/><br/>现在就可以使用 >manage.py syncdb 来更新 permissions 了<br/>Tags - <a href="http://blog.vkill.net/go.php/tags/%25E5%258E%259F%25E5%2588%259B/" rel="tag">原创</a> , <a href="http://blog.vkill.net/go.php/tags/%25E4%25BB%25A3%25E7%25A0%2581/" rel="tag">代码</a> , <a href="http://blog.vkill.net/go.php/tags/signal/" rel="tag">signal</a> , <a href="http://blog.vkill.net/go.php/tags/orm/" rel="tag">orm</a> , <a href="http://blog.vkill.net/go.php/tags/model/" rel="tag">model</a> , <a href="http://blog.vkill.net/go.php/tags/%25E6%259D%2583%25E9%2599%2590/" rel="tag">权限</a> , <a href="http://blog.vkill.net/go.php/tags/%25E5%25AD%25A6%25E4%25B9%25A0%25E7%25AC%2594%25E8%25AE%25B0/" rel="tag">学习笔记</a>
]]>
</description>
</item>
</channel>
</rss>
