ySJ
|
2.0/chapter08/#400 |
2010-04-14 17:05:56
|
(注意,虽然我们还没有讲到request.user,但是14章将要讲到它。就如你所想像的,request.user描述当前用户是登录的还是匿名。)
|
|
ySJ
|
2.0/chapter08/#400 |
2010-04-14 17:05:44
|
(注意,虽然我们还没有讲到request.user,但是14章将要讲到它。就如你所想像的,request.user描述当前用户是登陆的还是匿名)
|
|
ySJ
|
2.0/chapter08/#399 |
2010-04-14 16:59:14
|
这里,每一个视图开始都检查<literal>request.user</literal>是否是已经认证的,如果是的话,说明当前用户已经成功登陆站点,否则就重定向到<literal>/accounts/login/</literal> |
|
ySJ
|
2.0/chapter08/#395 |
2010-04-14 16:56:41
|
我们最后的视图技巧利用了一个高级python技术。
|
|
ySJ
|
2.0/chapter08/#391 |
2010-04-14 16:55:43
|
(我们通过指定pop的缺省值为None,来避免由于一个或者多个关键字缺失带来的KeyError。)
|
|
ySJ
|
2.0/chapter08/#390 |
2010-04-14 16:54:47
|
但是在我们这样做之前,我们要调用两次<literal>kwargs.pop()</literal><literal>以获得GET</literal>和<literal>POST</literal>参数
,前提是它们是合法的。
|
|
ySJ
|
2.0/chapter08/#389 |
2010-04-14 16:52:16
|
回过头来看<literal>method_splitter()</literal>,你会发现我们用<literal>*args</literal>和<literal>**kwargs</literal>接受任何参数并把它们传递到正确的视图。
|
|
ySJ
|
2.0/chapter08/#381 |
2010-04-14 16:43:30
|
如果你在函数定义时,在参数前面加两个*号,那么所有传递给函数的关键字参数,将会被包装成一个字典。
|
|
ySJ
|
2.0/chapter08/#380 |
2010-04-14 16:42:49
|
如果你在函数定义时,在参数前面加一个*号,那么所有传递给函数的<emphasis>位置参数</emphasis>将会被封装为一个元组.
|
|
ySJ
|
2.0/chapter08/#380 |
2010-04-14 16:42:03
|
如果你在函数定义时,在参数前面加一个*号,那么所有传递给函数的参数将会被封装为一个元组.
|
|
ySJ
|
2.0/chapter08/#378 |
2010-04-14 16:39:59
|
这里,我们重构method_splitter(),去掉了GET和POST两个关键字参数,改而使用*args和和**kwargs(注意*号)
|
|
ySJ
|
2.0/chapter08/#375 |
2010-04-14 16:38:49
|
我们先展示这些例子,接着再进行解释:
|
|
ySJ
|
2.0/chapter08/#374 |
2010-04-14 16:38:37
|
带星号的可变参数。
|
|
ySJ
|
2.0/chapter08/#373 |
2010-04-14 16:38:26
|
为了实现这个,我们可以使用Python中一个优雅的特性:
|
|
ySJ
|
2.0/chapter08/#371 |
2010-04-14 16:37:21
|
然而,当我们做到这一步时,我们仍然可以改进<literal> method_splitter</literal> 。从代码我们可以看到,它假设<literal> Get</literal> 和<literal> POST</literal> 视图除了<literal> request</literal> 之外不需要任何其他的参数。那么,假如我们让<literal> method_splitter</literal>和那种会从URL里捕捉字符,或者会接收一些可选参数的视图一起工作时该怎么办呢?
|
|
ySJ
|
2.0/chapter08/#362 |
2010-04-14 16:03:21
|
在URLconf中,我们把<literal> /somepage/</literal> 指向<literal> method_splitter()</literal> 函数,并把分别处理<literal> GET</literal> 和<literal> POST</literal>的函数作为额外参数传递给它。
|
|
ySJ
|
2.0/chapter08/#362 |
2010-04-14 16:02:05
|
在URLconf中,我们把<literal> /somepage/</literal> 指向<literal> method_splitter()</literal> 函数,并把视图函数额外需要用到的<literal> GET</literal> 和<literal> POST</literal> 参数传递给它。
|
|
ySJ
|
2.0/chapter08/#358 |
2010-04-14 16:00:08
|
我们写了一个新的视图,<literal> method_splitter()</literal> ,它根据<literal> request.method</literal> 返回的值来调用相应的视图。可以看到它带有两个关键字参数,<literal> GET</literal> 和<literal> POST</literal> ,它们应该是<emphasis> 视图函数</emphasis> 。如果<literal> request.method</literal> 返回<literal> GET</literal> ,那它就会自动调用<literal> GET</literal> 视图。
|
|
ySJ
|
2.0/chapter08/#353 |
2010-04-14 15:54:18
|
下边的示例展示了这个技术是如何帮我们简化<literal> some_page()</literal> 视图的:
|
|
ySJ
|
2.0/chapter08/#350 |
2010-04-14 15:49:59
|
一个比较好的设计习惯应该是,使用两个分开的视图函数——一个处理<literal> POST</literal> 请求,另一个处理<literal> GET</literal> 请求,然后在相应的地方分别调用。
|
|
ySJ
|
2.0/chapter08/#349 |
2010-04-14 15:48:10
|
<literal> /somepage/</literal>。正如大家所看到的,在同一个视图函数中对<literal> POST</literal> 和<literal> GET</literal> 进行处理是一种很不优雅的做法。
|
|
ySJ
|
2.0/chapter08/#349 |
2010-04-14 15:47:54
|
<literal> /somepage/。</literal>正如大家所看到的,在同一个视图函数中对<literal> POST</literal> 和<literal> GET</literal> 进行处理是一种很不优雅的做法。
|
|
ySJ
|
2.0/chapter08/#342 |
2010-04-14 15:41:59
|
说到基于请求方法的分支,让我们来看一下可以用什么优雅的方法来实现它。
|
|
ySJ
|
2.0/chapter08/#340 |
2010-04-14 15:36:45
|
视图函数的高级抽象
|
|
ySJ
|
2.0/chapter08/#331 |
2010-04-14 15:35:09
|
这并不包括 <literal>GET</literal> 或 <literal>POST</literal> 参数,或者域名。
|
|
ySJ
|
2.0/chapter08/#316 |
2010-04-14 15:12:05
|
许多内置Python函数是挑剔的(这是理所当然的),只接受特定类型的对象。
|
|
ySJ
|
2.0/chapter08/#315 |
2010-04-14 15:11:39
|
当你在写视图代码时记住这点很重要。
|
|
ySJ
|
2.0/chapter08/#309 |
2010-04-14 15:10:18
|
每个被捕获的参数将被作为纯Python Unicode字符串来发送给视图,而不管正则表达式中的格式。
|
|
ySJ
|
2.0/chapter08/#309 |
2010-04-14 15:09:09
|
每个被捕获的参数将被作为纯Python Unicode字符串来发送,而不管正则表达式中的格式。
|
|
ySJ
|
2.0/chapter08/#303 |
2010-04-14 15:08:03
|
在这种情况下,对<literal>/auth/user/add/</literal> 的请求将会被 <literal>user_add_stage</literal> 视图处理。
|
|
ySJ
|
2.0/chapter08/#295 |
2010-04-14 14:57:17
|
我们 <emphasis>可以</emphasis> 在视图中特别指出这种情况:
|
|
ySJ
|
2.0/chapter08/#294 |
2010-04-14 14:56:27
|
这将匹配像 <literal>/myblog/entries/add/</literal> 和 <literal>/auth/groups/add/</literal> 这样的URL 。然而,用户对象的添加页面( <literal>/auth/user/add/</literal> )是个特殊情况,因为它不会显示所有的表单域,它显示两个密码域等等。
|
|
ySJ
|
2.0/chapter08/#291 |
2010-04-14 14:55:55
|
比方说,你可以认为Django管理站点的对象添加页面时通过下面这个URLpattern所描述的方式来实现的:
|
|
ySJ
|
2.0/chapter08/#291 |
2010-04-14 14:53:56
|
比方说,你考虑通过下面这个URLpattern所描述的方式来向Django的管理站点添加一个目标页面:
|
|
ySJ
|
2.0/chapter08/#288 |
2010-04-14 14:51:36
|
有时你用一个模式来处理URLconf中的一系列URL,但是有时候你需要特别处理其中的某个URL。
|
|
ySJ
|
2.0/chapter08/#277 |
2010-04-14 13:30:20
|
如果匹配了第一个模式, <literal>page()</literal> 函数将会对参数 <literal>num</literal> 使用默认值 <literal>"1"</literal> ,如果第二个模式匹配成功, <literal>page()</literal> 函数将使用正则表达式传递过来的num的值。
|
|
ySJ
|
2.0/chapter08/#271 |
2010-04-14 13:19:16
|
这样,当没有给这个参数赋值的时候,视图将会使用默认值。
|
|
ySJ
|
2.0/chapter08/#254 |
2010-04-14 13:16:03
|
和额外参数之间的优先级
|
|
ySJ
|
2.0/chapter08/#253 |
2010-04-14 13:15:55
|
了解捕捉到的值
|
|
ySJ
|
2.0/chapter08/#253 |
2010-04-14 13:15:40
|
了解捕捉值
|
|
ySJ
|
2.0/chapter08/#250 |
2010-04-14 13:15:06
|
一个应用中比较常见的可供配置的地方是模板名字:
|
|
ySJ
|
2.0/chapter08/#247 |
2010-04-14 13:14:35
|
这种情况下,为你认为用户可能希望改变的配置选项添加一些钩子到视图中会是一个很好的主意。
|
|
ySJ
|
2.0/chapter08/#234 |
2010-04-14 13:12:02
|
每个Python的类都有一个 <literal>__name__</literal> 属性来返回类名。
|
|
ySJ
|
2.0/chapter08/#233 |
2010-04-14 13:11:44
|
我们使用 <literal>model.__name__.lower()</literal> 来确定模板的名字。
|
|
ySJ
|
2.0/chapter08/#231 |
2010-04-14 13:11:16
|
注意代码本身并不知道<literal>model</literal>是什么类型的对象;只是要求</literal>model</literal>对象有<literal>objects</literal>属性,并且该属性有<literal>all()</literal>方法。
|
|
ySJ
|
2.0/chapter08/#230 |
2010-04-14 13:08:25
|
model.objects.all()一行是鸭子界定:如果它走路像鸭子,叫声也像鸭子,那么我们就把它当做鸭子。
|
|
ySJ
|
2.0/chapter08/#199 |
2010-04-14 12:58:48
|
参数,它不会去管这些参数到底是捕捉回来的还是被额外提供的。month和day
|
|
ySJ
|
2.0/chapter08/#198 |
2010-04-14 12:55:26
|
视图函数只会关心它 <emphasis>获得</emphasis> 了
|
|
ySJ
|
2.0/chapter08/#192 |
2010-04-14 12:35:00
|
当你想添加另外一个使用 <literal>my_view</literal> 视图但不包含<literal>month</literal>和/或者<literal>day</literal>的URL时,问题就出现了。
|
|
ySJ
|
2.0/chapter08/#180 |
2010-04-14 11:27:35
|
这种情况下,你可以通过向同一个视图传递额外URLconf参数来伪造URL值的捕捉。
|
|