ySJ
|
2.0/chapter09/#514 |
2010-04-16 15:49:53
|
和注册过滤器类似,也可以在Python2.4及其以上版本中使用 <literal>register.tag</literal>装饰器:
|
|
ySJ
|
2.0/chapter09/#505 |
2010-04-16 15:24:00
|
例如:
|
|
ySJ
|
2.0/chapter09/#478 |
2010-04-16 15:02:57
|
这个函数可以抛出 <literal>django.template.TemplateSyntaxError</literal> ,这个异常提供所有语法错误的有用信息。
|
|
ySJ
|
2.0/chapter09/#481 |
2010-04-16 15:12:48
|
<literal>token.split_contents()[0]</literal><emphasis>总是</emphasis>记录标签的名字,就算标签没有任何参数。
|
|
ySJ
|
2.0/chapter09/#494 |
2010-04-16 15:16:07
|
这两个函数( <literal>__init__()</literal> 和 <literal>render()</literal> )与模板处理中的两步(编译与渲染)直接对应。
|
|
ySJ
|
2.0/chapter09/#570 |
2010-04-16 16:34:42
|
例如,这个自定义模板标签<literal>{% upper %}</literal>,它会把它自己和<literal>{% endupper %}</literal>之间的内容变成大写:
|
|
ySJ
|
2.0/chapter09/#497 |
2010-04-16 15:18:28
|
与模板过滤器一样,这些渲染函数应该静静地捕获错误,而不是抛出错误。
|
|
ySJ
|
2.0/chapter09/#498 |
2010-04-16 15:20:24
|
模板标签只允许在编译的时候抛出错误。
|
|
ySJ
|
2.0/chapter09/#502 |
2010-04-16 15:21:41
|
最后,你需要用你模块的<literal>Library</literal> 实例注册这个标签。
|
|
ySJ
|
2.0/chapter09/#504 |
2010-04-16 15:23:44
|
只需实例化一个 <literal>template.Library</literal> 实例然后调用它的 <literal>tag()</literal> 方法。
|
|
ySJ
|
2.0/chapter09/#568 |
2010-04-16 16:30:36
|
在前一个例子中, <literal>do_comment()</literal> 抛弃了<literal>{% comment %}</literal> 和 <literal>{% endcomment %}</literal> 之间的所有内容。当然也可以修改和利用下标签之间的这些内容。
|
|
ySJ
|
2.0/chapter10/#140 |
2010-04-19 13:18:25
|
请保证操作的顺序正确。
|
|
ySJ
|
2.0/chapter10/#91 |
2010-04-19 11:14:23
|
如果你使用了某种版本控制工具,并且在第一步中,已经提交了你在开发环境上的修改,现在,可以在生产环境中更新你的代码了(例如,如果你使用Subversion,执行<literal>svn update</literal>。
|
|
ySJ
|
2.0/chapter10/#90 |
2010-04-19 11:12:26
|
将新的字段加入到模型中。
|
|
ySJ
|
2.0/chapter10/#88 |
2010-04-19 11:12:11
|
执行在开发环境步骤中,第三步的<literal>ALTER TABLE</literal>语句。
|
|
ySJ
|
2.0/chapter10/#84 |
2010-04-19 11:11:12
|
然后在你的产品服务器上再实施一遍这些步骤。
|
|
ySJ
|
2.0/chapter10/#82 |
2010-04-19 11:09:27
|
使用Python的<literal>manage.py shell</literal>,通过导入模型和选中表单(例如,
<literal>MyModel.objects.all()[:5]</literal> )来验证新的字段是否被正确的添加 ,如果一切顺利,所有的语句都不会报错。
|
|
ySJ
|
2.0/chapter10/#80 |
2010-04-19 11:07:30
|
开启你的数据库的交互命令界面(比如, <literal>psql</literal> 或<literal>mysql</literal> , 或者可以使用
<literal>manage.py dbshell</literal> )。 执行 <literal>ALTER TABLE</literal> 语句来添加新列。
|
|
ySJ
|
2.0/chapter10/#78 |
2010-04-19 11:05:29
|
注意为新字段的列定义。
|
|
ySJ
|
2.0/chapter10/#77 |
2010-04-19 11:02:06
|
运行 <literal>manage.py sqlall [yourapp]</literal> 来测试模型新的 <literal>CREATE TABLE</literal> 语句。
|
|
ySJ
|
2.0/chapter10/#75 |
2010-04-19 11:01:48
|
在你的模型里添加字段。
|
|
ySJ
|
2.0/chapter10/#73 |
2010-04-19 11:00:20
|
首先,进入开发环境(也就是说,不是在发布环境里):
|
|
ySJ
|
2.0/chapter10/#73 |
2010-04-19 11:00:14
|
首先,进入开发环境(也就是说 不是在发布环境里):
|
|
ySJ
|
2.0/chapter10/#71 |
2010-04-19 10:59:57
|
(你<emphasis>正</emphasis>使用的是测试/开发环境,对吧?)下面是具体的实施步骤。
|
|
ySJ
|
2.0/chapter10/#70 |
2010-04-19 10:59:01
|
这个鸡-蛋的问题的解决方法是在开发者环境里而不是发布环境里实现这个变化。
|
|
ySJ
|
2.0/chapter10/#68 |
2010-04-19 10:58:36
|
(注意:你并 <emphasis>不是非得使用</emphasis>与Django相同的SQL语句创建新的字段,但是这样做确实是一个好主意 ,它能让一切都保持同步。)
|
|
ySJ
|
2.0/chapter10/#65 |
2010-04-19 10:56:36
|
策略就是现在数据库里加入字段,然后同步Django的模型以包含新字段。
|
|
ySJ
|
2.0/chapter10/#95 |
2010-04-19 11:16:05
|
让我们实践下,比如添加一个num_pages字段到第五章中Book模型。首先,我们会把开发环境中的模型改成如下形式:
|
|
ySJ
|
2.0/chapter10/#99 |
2010-04-19 11:23:02
|
阅读第六章的“设置可选字段”以及下面的“添加非空列”小节以了解我们在这里添加<literal>blank=True</literal>和<literal>null=True</literal>的原因。)
|
|
ySJ
|
2.0/chapter10/#137 |
2010-04-19 13:18:12
|
用以下命令从数据库中删除字段:
|
|
ySJ
|
2.0/chapter10/#135 |
2010-04-19 13:17:46
|
删除字段,然后重新启动你的web服务器。
|
|
ySJ
|
2.0/chapter10/#133 |
2010-04-19 13:16:29
|
删除字段,仅仅只要以下几个步骤:
|
|
ySJ
|
2.0/chapter10/#132 |
2010-04-19 13:16:17
|
从Model中删除一个字段要比添加容易得多。
|
|
ySJ
|
2.0/chapter10/#128 |
2010-04-19 13:15:05
|
然后我们更新生产环境中的模型,最后重启web服务器。
|
|
ySJ
|
2.0/chapter10/#127 |
2010-04-19 13:14:11
|
如果没有异常发生,我们将切换到生产服务器,然后在生产环境的数据库中执行命令<literal>ALTER TABLE</literal> |
|
ySJ
|
2.0/chapter10/#124 |
2010-04-19 13:09:15
|
执行ALTER TABLE之后,我们要验证一下修改结果是否正确。启动python并执行下面的代码:
|
|
ySJ
|
2.0/chapter10/#122 |
2010-04-19 12:54:59
|
如果你这样做,记得你不要在模型中添加 blank=True 和 null=True 选项。
|
|
ySJ
|
2.0/chapter10/#117 |
2010-04-19 12:50:06
|
然而,想要添加不能含有空值的字段也是可以的。
|
|
ySJ
|
2.0/chapter10/#114 |
2010-04-19 12:45:32
|
在我们添加字段num_pages的时候,我们使用了 blank=True 和 null=True 选项。
|
|
ySJ
|
2.0/chapter10/#113 |
2010-04-19 11:29:28
|
这里有个微妙之处值得一提。
|
|
ySJ
|
2.0/chapter10/#99 |
2010-04-19 11:29:04
|
阅读第六章的“设置可选字段”以及本章下面的“添加非空列”小节以了解我们在这里添加<literal>blank=True</literal>和<literal>null=True</literal>的原因。)
|
|
ySJ
|
2.0/chapter10/#108 |
2010-04-19 11:28:18
|
接下来,我们要在开发环境上运行数据库客户端,如果是PostgreSQL,运行 psql,,然后,我执行如下语句。
|
|
ySJ
|
2.0/chapter10/#102 |
2010-04-19 11:26:51
|
语句的具体内容取决与你所使用的数据库, 大概是这个样子:
|
|
ySJ
|
2.0/chapter10/#101 |
2010-04-19 11:24:07
|
然后,我们运行命令manage.py sqlall books 来查看CREATE TABLE语句。
|
|
ySJ
|
2.0/chapter10/#65 |
2010-04-19 10:56:16
|
策略就是现在数据库里加入字段,然后同步Django的模型以添加新字段。
|
|
ySJ
|
2.0/chapter10/#67 |
2010-04-19 10:55:21
|
然而 这里有一个鸡生蛋蛋生鸡的问题 ,由于要想了解新增列的SQL语句,你需要使用Django的
<literal>manage.py sqlall</literal>命令进行查看 ,而这又需要字段已经在模型里存在了。
|
|
ySJ
|
2.0/chapter09/#677 |
2010-04-16 17:07:20
|
如果我们将这个代码放入一个叫mysite.zip_loader的包中,那么我们要把mysite.zip_loader.load_template_source加到TEMPLATE_LOADERS中。
|
|
ySJ
|
2.0/chapter09/#676 |
2010-04-16 17:06:44
|
我们要想使用它,还差最后一步,就是把它加入到 <literal>TEMPLATE_LOADERS</literal> 。
|
|
ySJ
|
2.0/chapter09/#663 |
2010-04-16 17:04:16
|
由于那个路径可能会出于调试目的显示给用户,因此它应当很快的指明模板从哪里加载。
|
|
ySJ
|
2.0/chapter09/#659 |
2010-04-16 17:02:06
|
参数 <literal>template_name</literal> 是所加载模板的名称 (和传递给 <literal>loader.get_template()</literal> 或者 <literal>loader.select_template()</literal> 一样), 而 <literal>template_dirs</literal> 是一个可选的代替<literal>TEMPLATE_DIRS</literal>的搜索目录列表。
|
|