15325@qq.com
|
2.0/chapter06/#179 |
2009-11-11 14:11:46
|
在<literal> books</literal> 应用程序目录下的<literal> admin.py</literal> 文件中,每次调用<literal> admin.site.register()</literal> 都将那个模块注册到管理工具中。
|
|
IIssNan
|
2.0/chapter07/#175 |
2009-11-11 14:10:51
|
现在我们再来找出这个简单的例子中的不足,然后改进他们。
|
|
IIssNan
|
2.0/chapter07/#174 |
2009-11-11 14:09:52
|
同上一章一样,我们先从最为简单、有效的例子开始。
|
|
15325@qq.com
|
2.0/chapter06/#185 |
2009-11-11 12:33:43
|
综上所述,管理工具其实就是一个Django应用程序,包含自己的模块、模板、试图和URLpatterns。
|
|
15325@qq.com
|
2.0/chapter06/#183 |
2009-11-11 12:32:28
|
其它的<literal>django.contrib</literal>应用程序,如<literal>django.contrib.redirects</literal>,其它从网上下在的第三方Django应用程序一样,都会自行添加到管理工具。
|
|
15325@qq.com
|
2.0/chapter06/#183 |
2009-11-11 12:31:59
|
其它的<literal>django.contrib</literal>应用程序,如<literal>django.contrib.redirects</literal>,其它从网上下在的第三方Django应用程序一样,都需要自行添加到管理工具。
|
|
15325@qq.com
|
2.0/chapter06/#182 |
2009-11-11 12:28:39
|
程序<literal> django.contrib.auth</literal> 包含自身的<literal> admin.py</literal> ,所以Users和Groups能在管理工具中自动显示。
|
|
15325@qq.com
|
2.0/chapter06/#180 |
2009-11-11 12:27:20
|
管理工具只为那些明确注册了的模块显示一个编辑/修改的界面。
|
|
15325@qq.com
|
2.0/chapter06/#180 |
2009-11-11 12:27:11
|
管理工具只为那些明确注册了的模块显示一个编辑/修改的界面
|
|
15325@qq.com
|
2.0/chapter06/#180 |
2009-11-11 12:26:59
|
管理工具仅仅为那些明确注册了的模块显示一个编辑/修改的界面
|
|
15325@qq.com
|
2.0/chapter06/#179 |
2009-11-11 12:24:10
|
在<literal> books</literal> 程序目录下的<literal> admin.py</literal> 文件中,每次调用<literal> admin.site.register()</literal> 都将那个模块注册到管理工具中。
|
|
15325@qq.com
|
2.0/chapter06/#177 |
2009-11-11 12:20:53
|
如果在指定的app目录下找到<literal>admin.py</literal>,它就执行其中的代码。
|
|
15325@qq.com
|
2.0/chapter06/#176 |
2009-11-11 12:19:17
|
这个函数遍历<literal>INSTALLED_APPS</literal>配置,并且寻找相关的 <literal>admin.py</literal>文件。
|
|
15325@qq.com
|
2.0/chapter06/#175 |
2009-11-11 12:16:42
|
当服务启动时,Django从<literal> url.py</literal> 引导URLconf,然后执行<literal> admin.autodiscover()</literal> 语句。
|
为避免产生疑惑,稍有忽略。
|
15325@qq.com
|
2.0/chapter06/#173 |
2009-11-11 12:11:47
|
其实很简单。
|
|
15325@qq.com
|
2.0/chapter06/#172 |
2009-11-11 12:10:44
|
在幕后,管理工具是如何工作的呢?
|
|
15325@qq.com
|
2.0/chapter06/#172 |
2009-11-11 12:10:15
|
它在幕后是如何工作的呢?
|
|
IIssNan
|
2.0/chapter07/#170 |
2009-11-11 12:00:43
|
注意这里pluralize的使用,这个过滤器在适当的时候会输出s(例如找到多本书籍)。
|
|
IIssNan
|
2.0/chapter07/#167 |
2009-11-11 11:54:51
|
查询结果的显示模板search_results.html如下所示:
|
|
IIssNan
|
2.0/chapter07/#166 |
2009-11-11 11:54:02
|
最后,我们给模板传递来books,一个包含Book对象的列表。
|
|
IIssNan
|
2.0/chapter07/#164 |
2009-11-11 11:51:00
|
在网上搜索“开源 全文搜索”看看是否有好的方法)
|
|
IIssNan
|
2.0/chapter07/#163 |
2009-11-11 11:49:55
|
(在真实的案例中,我们可以使用以某种分类的自定义查询系统。
|
|
IIssNan
|
2.0/chapter07/#162 |
2009-11-11 11:48:32
|
我们不推荐在一个包含大量产品的数据库中使用icontains查询,因为那会很慢。
|
|
IIssNan
|
2.0/chapter07/#161 |
2009-11-11 11:47:34
|
这是实现书籍查询的一个很简单的方法。
|
|
IIssNan
|
2.0/chapter07/#159 |
2009-11-11 11:45:27
|
icontains是一个查询关键字(参看第五章和附录B)。这个语句可以理解为获取标题里包含q的书籍,不区分大小写。
|
|
IIssNan
|
2.0/chapter07/#158 |
2009-11-11 11:43:15
|
我们使用Book.objects.filter(title__icontains=q)获取数据库中标题包含q的书籍。
|
|
IIssNan
|
2.0/chapter07/#156 |
2009-11-11 11:40:38
|
除了检查q是否存在于request.GET之外,我们还检查来reuqest.GET['q']的值是否为空。
|
|
IIssNan
|
2.0/chapter07/#154 |
2009-11-11 11:39:17
|
让我们来分析一下上面的代码:
|
|
IIssNan
|
2.0/chapter07/#151 |
2009-11-11 11:36:51
|
既然我们已经确认用户所提交的数据是有效的,那么接下来我们就可以从数据库中查询这个有效的数据(同样,在views.py里操作):
|
|
IIssNan
|
2.0/chapter07/#148 |
2009-11-11 11:33:52
|
在这个搜索书籍的例子里,我们使用GET,因为这个查询不会更改服务器数据的状态。
|
|
IIssNan
|
2.0/chapter07/#147 |
2009-11-11 11:33:01
|
而当我们提交表单时需要更改服务器数据的状态,或者说发送e-mail,或者其他不仅仅是获取并显示数据的时候就使用POST。
|
|
IIssNan
|
2.0/chapter07/#146 |
2009-11-11 11:31:40
|
获取使用POST方法的数据与GET的相似,只是使用request.POST代替了request.GET。那么,POST与GET之间有什么不同?当我们提交表单仅仅需要获取数据时就可以用GET;
|
|
IIssNan
|
2.0/chapter07/#144 |
2009-11-11 11:27:59
|
第三章介绍Django的URLconf系统时我们比较了Django的简洁的URL与PHP/Java传统的URL,我们提到将在第七章讲述如何使用传统的URL。通过刚才的介绍,我们知道在视图里可以使用request.GET来获取传统URL里的查询字符串(例如hours=3)。
|
|
IIssNan
|
2.0/chapter07/#143 |
2009-11-11 11:24:16
|
因为使用GET方法的数据是通过查询字符串的方式传递的(例如/search/?q=django),所以我们可以使用requet.GET来获取这些数据。
|
|
IIssNan
|
2.0/chapter07/#138 |
2009-11-11 11:21:13
|
在这里若我们没有进行检测,那么用户提交一个空的表单将引发KeyError异常:
|
|
IIssNan
|
2.0/chapter07/#137 |
2009-11-11 11:19:35
|
需要注意的是在这里我们明确地判断q是否包含在request.GET中。就像上面request.META小节里面提到,对于用户提交过来的数据,甚至是正确的数据,我们都需要进行过滤。
|
|
IIssNan
|
2.0/chapter07/#135 |
2009-11-11 11:14:43
|
处理/search/(search())的视图通过request.GET来获取q的值。
|
|
IIssNan
|
2.0/chapter07/#133 |
2009-11-11 11:13:11
|
在HTML里我们定义了一个变量q。当提交表单时,变量q的值通过GET(method="get")附加在URL /search/上。
|
|
IIssNan
|
2.0/chapter07/#127 |
2009-11-11 11:08:40
|
让我们添加第二个视图函数并设置URL:
|
|
IIssNan
|
2.0/chapter07/#99 |
2009-11-11 11:04:46
|
POST数据是来自HTML中的〈form〉标签提交的,而GET数据可能来自〈form〉提交也可能是URL中的查询字符串(the query string)。
|
|
IIssNan
|
2.0/chapter07/#67 |
2009-11-11 10:56:56
|
例如:
|
|
IIssNan
|
2.0/chapter07/#48 |
2009-11-11 10:53:56
|
否则返回False
|
|
IIssNan
|
2.0/chapter07/#47 |
2009-11-11 10:53:36
|
如果通过HTTPS访问,则此方法返回True,
|
|
IIssNan
|
2.0/chapter07/#47 |
2009-11-11 10:53:08
|
如果通过HTTPS访问,则此变量值为True,
|
|
IIssNan
|
2.0/chapter07/#41 |
2009-11-11 10:52:15
|
请求路径,可能包含查询字符串
|
|
IIssNan
|
2.0/chapter07/#35 |
2009-11-11 10:50:57
|
主机名(比如,通常所说的域名)
|
|
15325@qq.com
|
2.0/chapter06/#168 |
2009-11-11 10:49:46
|
。
|
意思出来就行了
|
15325@qq.com
|
2.0/chapter06/#167 |
2009-11-11 10:49:34
|
当你在那个窗口中成功创建了一个publisher后,Add book表单会自动把它更新到字段上去
|
|
15325@qq.com
|
2.0/chapter06/#167 |
2009-11-11 10:49:14
|
当你在那个窗口中成功创建了一个publisher后,Add book表单会自动把它更新到字段上去。
|
|
IIssNan
|
2.0/chapter07/#29 |
2009-11-11 10:49:13
|
除域名以外的请求路径,以正斜杠开头
|
|