ySJ
|
2.0/chapter07/#318 |
2010-04-13 17:32:46
|
若用户刷新一个包含POST表单的页面,那么请求将会重复发送。
|
|
ySJ
|
2.0/chapter07/#302 |
2010-04-13 17:28:04
|
虽然email非必填项,但如果它被提交了,我们也需进行验证。
|
|
ySJ
|
2.0/chapter07/#288 |
2010-04-13 17:23:12
|
这无关紧要,只要在URLconf里正确设置URL与视图之间的映射,Django会正确处理的。
|
|
ySJ
|
2.0/chapter07/#272 |
2010-04-13 17:18:51
|
当这个表单提交并且数据通过验证后,系统将自动发送一封包含用户提交信息的e-mail给站点工作人员。
|
|
ySJ
|
2.0/chapter07/#266 |
2010-04-13 17:17:02
|
虽然我们一直使用书籍搜索的示例表单,并将其改进得很完美,但它还是相当简陋:
|
|
ySJ
|
2.0/chapter07/#253 |
2010-04-13 17:14:55
|
我们一成不变的提示信息很容易使人产生困惑:
|
|
ySJ
|
2.0/chapter07/#213 |
2010-04-13 17:07:32
|
这样,如果你将<literal>search()</literal>视图指向其它页面的话,你也用不着再修改<literal>action</literal>。
|
|
ySJ
|
2.0/chapter07/#200 |
2010-04-13 17:02:26
|
在改进后的视图中,若用户访问/search/并且没有提交GET参数,那么他将看到一个没有错误信息的表单;
|
|
ySJ
|
2.0/chapter07/#197 |
2010-04-13 17:01:23
|
所以,只要我们改变search()视图:当用户访问/search/并未提交任何GET参数时就隐藏错误信息,这样就可以去掉search_form()视图以及对应的URLpattern。
|
|
ySJ
|
2.0/chapter07/#185 |
2010-04-13 16:46:31
|
(注意,将search_form()视图也包含进来以便查看。)
|
|
ySJ
|
2.0/chapter07/#182 |
2010-04-13 16:46:08
|
最简单的实现方法既是添加else分句重新渲染表单,代码如下:
|
|
ySJ
|
2.0/chapter07/#166 |
2010-04-13 16:41:26
|
最后,我们把books传给模板,它是一个包含Book对象的列表。
|
|
ySJ
|
2.0/chapter07/#166 |
2010-04-13 16:39:23
|
最后,我们books穿给模板,它是一个包含Book对象的列表。
|
|
ySJ
|
2.0/chapter07/#164 |
2010-04-13 16:38:16
|
在网上搜索“开源 全文搜索”看看是否有好的方法。)
|
|
ySJ
|
2.0/chapter07/#146 |
2010-04-13 16:10:32
|
获取使用POST方法的数据与GET的相似,只是使用request.POST代替了request.GET。那么,POST与GET之间有什么不同?当我们提交表单仅仅是为了获取数据时就可以用GET;
|
|
ySJ
|
2.0/chapter07/#137 |
2010-04-13 16:06:57
|
需要注意的是我们在这里明确地判断q是否包含在request.GET中。就像上面request.META小节里面提到的,不应该相信任何用户提交过来的数据,甚至不应该假定用户提交过数据。
|
|
ySJ
|
2.0/chapter07/#106 |
2010-04-13 15:57:07
|
前端HTML页面用户接口和后台对所提交数据进行处理的view函数。
|
|
ySJ
|
2.0/chapter07/#73 |
2010-04-13 15:50:12
|
(HTTP header信息是由用户的浏览器所提交的、不应该给予信任的<emphasis>外部</emphasis>数据,因此你应该好好设计你的程序以便当一个特定的Header数据不存在时,给出一个优雅的回应。)你应该用 try/except 语句,或者用Python字典的 get() 方法来处理这些操作未定义键的情况:
|
|
ySJ
|
2.0/chapter07/#63 |
2010-04-13 15:41:44
|
<literal>HTTP_REFERER</literal>,请求的链接地址,如果有的话。
|
|
ySJ
|
2.0/chapter07/#18 |
2010-04-13 15:22:15
|
HttpRequest对象包含当前请求的URL的一些信息:
|
|
ySJ
|
2.0/chapter07/#13 |
2010-04-13 15:20:49
|
HttpRequest对象,比如上面代码里的request变量,拥有大量有趣的属性和方法,你应该熟悉它们,以便知道能拿它们来做些什么。
|
|
ySJ
|
2.0/chapter06/#514 |
2010-04-13 15:11:22
|
换句话说,Django的管理界面为内容输入人员和开发人员协同工作提供了便利。
|
|
ySJ
|
2.0/chapter06/#493 |
2010-04-13 15:04:04
|
<emphasis>组</emphasis> 简化了给组中所有成员授予一套权限的动作。
|
|
ySJ
|
2.0/chapter06/#483 |
2010-04-13 15:02:08
|
请注意,这些权限是定义在模块级别上,而不是对象级别上的。举个例子,你可以让约翰修改任何图书,但是不能让他仅修改由Apress出版的图书。
|
|
ySJ
|
2.0/chapter06/#478 |
2010-04-13 14:59:47
|
<emphasis>创建</emphasis>权限, <emphasis>权限</emphasis> 权限和 <emphasis>删除</emphasis> 权限。
|
|
ySJ
|
2.0/chapter06/#476 |
2010-04-13 14:59:07
|
普通用户,即激活的非超级用户的管理用户可以根据一套设定好的权限进入。
|
|
ySJ
|
2.0/chapter06/#471 |
2010-04-13 14:56:57
|
由于相同的用户可以被用于控制公共页面(即:非管理页面)的存取(详见第十四章),这个标志可用来区分公共用户和管理用户。
|
|
ySJ
|
2.0/chapter06/#470 |
2010-04-13 14:54:54
|
成员标志,它用来控制这个用户是否可以登录管理界面(即:这个用户是不是你们组织里的成员)。
|
|
ySJ
|
2.0/chapter06/#467 |
2010-04-13 14:54:11
|
激活标志,它用来控制用户是否已经激活。
|
|
ySJ
|
2.0/chapter06/#464 |
2010-04-13 14:53:44
|
如你所想,用户对象有标准的用户名、密码、邮箱地址和真实姓名字段,同时它还拥有关于使用管理界面的权限定义的字段。
|
|
ySJ
|
2.0/chapter06/#462 |
2010-04-13 14:52:32
|
你通过管理界面编辑用户及其权限,就像你编辑别的对象一样。
|
|
ySJ
|
2.0/chapter06/#451 |
2010-04-13 14:48:53
|
考虑到人们通常不会记住这些数据库ID,管理工具提供了一个放大镜图标方便你输入。点击那个图标将会弹出一个窗口,在那里你可以选择想要添加的publisher。
|
|
ySJ
|
2.0/chapter06/#435 |
2010-04-13 14:45:06
|
它与<literal>filter_horizontal</literal>非常相似,除了控件都是垂直排列,而不是水平排列的。
|
|
ySJ
|
2.0/chapter06/#424 |
2010-04-13 14:43:26
|
刷新book编辑页面,你会看到Author区中有一个精巧的JavaScript过滤器,它允许你动态检索选项,然后将选中的authors从Available框移到Chosen框,还可以移回来。
|
|
ySJ
|
2.0/chapter06/#417 |
2010-04-13 14:39:44
|
虽然管理工具为此添加了注释(help_text),但是当你的字段有几百个选项时,它依然显得笨拙。
|
|
ySJ
|
2.0/chapter06/#415 |
2010-04-13 14:38:33
|
如我们在book编辑页面看到的那样,<literal> 多对多字段</literal> 被展现成多选框。虽然多选框在逻辑上是最适合的HTML控件,但它却不那么好用。
|
|
ySJ
|
2.0/chapter06/#404 |
2010-04-13 14:36:36
|
当你的admin用户只是被授权可以更改你的某一部分数据时,或者,你的数据被一些外部的程序自动处理而改变了,你就可以使用这个功能。
|
|
ySJ
|
2.0/chapter06/#403 |
2010-04-13 14:35:28
|
只要不选上不想被编辑的字段即可。
|
|
ySJ
|
2.0/chapter06/#402 |
2010-04-13 14:35:11
|
通过fields这个选项,你可以排除一些不想被其他人编辑的字段。
|
|
ySJ
|
2.0/chapter06/#390 |
2010-04-13 14:32:20
|
正如自定义列表那样,编辑表单也可以用很多方式自定义。
|
|
ySJ
|
2.0/chapter06/#378 |
2010-04-13 14:30:05
|
注意Publication
date列头现在有一个小箭头来显示记录已经排序。
|
|
ySJ
|
2.0/chapter06/#370 |
2010-04-13 14:26:44
|
最后,让我们改变默认的排序方式,按publication_date降序排列。
|
|
ySJ
|
2.0/chapter06/#361 |
2010-04-13 14:25:39
|
修改好后,页面中的列表顶端会有一个逐层深入的日期导航条,效果如图 6-11。
|
|
ySJ
|
2.0/chapter06/#361 |
2010-04-13 14:25:32
|
修改好后,页面中的列表顶端会有一个逐层深入的日期导航条,效果如图 6-11.
|
|
ySJ
|
2.0/chapter06/#344 |
2010-04-13 14:15:20
|
接下来,让我们为<literal>Book</literal>列表页添加一些日期过滤器。
|
|
ySJ
|
2.0/chapter06/#338 |
2010-04-13 14:14:21
|
正如用户所希望的那样,它是大小写不敏感的,并且对两个字段检索的查询框。如果查询<literal>"bar"</literal>,那么名字中含有Barney和姓氏中含有Hobarson的作者记录将被检索出来。
|
|
ySJ
|
2.0/chapter06/#338 |
2010-04-13 14:12:03
|
正如用户所希望的那样,它是大小写敏感的,并且对两个字段检索的查询框。如果查询<literal>"bar"</literal>,那么名字中含有Barney和姓氏中含有Hobarson的作者记录将被检索出来。
|
|
ySJ
|
2.0/chapter06/#328 |
2010-04-13 14:09:45
|
130
|
|
ySJ
|
2.0/chapter06/#316 |
2010-04-13 13:37:06
|
当然,这些字段名称必须是模块中存在的。
|
|
ySJ
|
2.0/chapter06/#315 |
2010-04-13 13:32:45
|
我们只自定义了一项:<literal>list_display</literal>, 它是一个用于控制列表显示字段的元组。
|
|