提交 0bcda0d6 编写于 作者: W wizardforcel

9.11

上级 d02cecc8
......@@ -200,13 +200,13 @@ Django 有一个模板搜索路径板,它让你尽可能的减少冗余而重
{% endfor %}
{% endblock %}
```
变量使用双花括号包围。``{{ article.headline }}`` 表示 “输出 article 的 headline 属性”。而点符号不仅用于表示属性查找,还可用于字典的键值查找、索引查找和函数调用。
变量使用双花括号包围。`{{ article.headline }} 表示 “输出 article 的 headline 属性”。而点符号不仅用于表示属性查找,还可用于字典的键值查找、索引查找和函数调用。
注意 {{ article.pub_date|date:"F j, Y" }} 使用了 Unix 风格的“管道”(“|”符合)。这就是所谓的模板过滤器,一种通过变量来过滤值的方式。本例中,Python datetime 对象被过滤成指定的格式(在 PHP 的日期函数中可以见到这种变换)。
注意 `{{ article.pub_date|date:"F j, Y" }}` 使用了 Unix 风格的“管道”(“|”符合)。这就是所谓的模板过滤器,一种通过变量来过滤值的方式。本例中,Python datetime 对象被过滤成指定的格式(在 PHP 的日期函数中可以见到这种变换)。
你可以无限制地串联使用多个过滤器。你可以编写自定义的过滤器。你可以定制自 己的模板标记,在幕后运行自定义的 Python 代码。
最后,Django 使用了“模板继承”的概念:这就是 {% extends "base.html" %} 所做的事。它意味着 “首先载入名为 ‘base’ 的模板中的内容到当前模板,然后再处理本模板中的其余内容。”总之,模板继承让你在模板间大大减少冗余内容:每一个模板只需要定义它独特的部分即可。
最后,Django 使用了“模板继承”的概念:这就是 `{% extends "base.html" %}` 所做的事。它意味着 “首先载入名为 ‘base’ 的模板中的内容到当前模板,然后再处理本模板中的其余内容。”总之,模板继承让你在模板间大大减少冗余内容:每一个模板只需要定义它独特的部分即可。
下面是使用了 *静态文件* 的 “base.html” 模板的大概样子:
......
......@@ -342,7 +342,7 @@ print(django.__path__)"
然后,只需要编辑该文件并将通用的 Djangot 文字替换为你认为适合的属于你自己的网站名。
该模板包含了大量的文字,比如 {% block branding %} 和 {{ title }}``。``{% 和 {{ 标记是 Django 模板语言的一部分。 当 Django 呈现 admin/base_site.html 时,根据模板语言生成最终的 HTML 页面。 Don’t worry if you can’t make any sense of the template right now – 如果你现在不能理解模板的含义先不用担心 – 我们将在教程 3 中深入探讨 Django’ 的模板语言。
该模板包含了大量的文字,比如 `{% block branding %}``{{ title }}``{%``{{` 标记是 Django 模板语言的一部分。 当 Django 呈现 admin/base_site.html 时,根据模板语言生成最终的 HTML 页面。 Don’t worry if you can’t make any sense of the template right now – 如果你现在不能理解模板的含义先不用担心 – 我们将在教程 3 中深入探讨 Django’ 的模板语言。
请注意 Django 默认的管理网站中的任何模板都是可覆盖的。 要覆盖一个模板,只需要像刚才处理 base_site.html 一样 – 从默认的目录下复制到你的自定义目录下,并修改它。
......
......@@ -333,9 +333,9 @@ get_object_or_404() 函数需要一个 Django 模型类作为第一个参数以
</ul>
```
模板系统使用了“变量.属性”的语法访问变量的属性值。 例如 {{ poll.question }} , 首先 Django 对 poll 对象做字典查询。 否则 Django 会尝试属性查询 – 在本例中属性查询成功了。 如果属性查询还是失败了,Django 将尝试 list-index 查询。
模板系统使用了“变量.属性”的语法访问变量的属性值。 例如 `{{ poll.question }}` , 首先 Django 对 poll 对象做字典查询。 否则 Django 会尝试属性查询 – 在本例中属性查询成功了。 如果属性查询还是失败了,Django 将尝试 list-index 查询。
{% for %} 循环中有方法调用: poll.choice_set.all 就是 Python 代码 poll.choice_set.all(),它将返回一组可迭代的 Choice 对象,可以用在 {% for %} 标签中。
`{% for %}` 循环中有方法调用: poll.choice_set.all 就是 Python 代码 poll.choice_set.all(),它将返回一组可迭代的 Choice 对象,可以用在 `{% for %}` 标签中。
请参阅 模板指南 来了解模板的更多内容。
......@@ -347,7 +347,7 @@ get_object_or_404() 函数需要一个 Django 模型类作为第一个参数以
<li><a href="/polls/{{ poll.id }}/">{{ poll.question }}</a></li>
```
问题出在硬编码,紧耦合使得在大量的模板中修改 URLs 成为富有挑战性的项目。 不过,既然你在 polls.urls 模块中的 url() 函数中定义了 命名参数,那么就可以在 url 配置中使用 {% url %} 模板标记来移除特定的 URL 路径依赖:
问题出在硬编码,紧耦合使得在大量的模板中修改 URLs 成为富有挑战性的项目。 不过,既然你在 polls.urls 模块中的 url() 函数中定义了 命名参数,那么就可以在 url 配置中使用 `{% url %}` 模板标记来移除特定的 URL 路径依赖:
```
<li><a href="{% url 'detail' poll.id %}">{{ poll.question }}</a></li>
......@@ -355,7 +355,7 @@ get_object_or_404() 函数需要一个 Django 模型类作为第一个参数以
> Note
>
> 如果 {% url 'detail' poll.id %} (含引号) 不能运行,但是 {% url detail poll.id %} (不含引号) 却能运行,那么意味着你使用的 Djang 低于 < 1.5 版。这样的话,你需要在模板文件的顶部添加如下的声明::
> 如果 `{% url 'detail' poll.id %}` (含引号) 不能运行,但是 `{% url detail poll.id %}` (不含引号) 却能运行,那么意味着你使用的 Djang 低于 < 1.5 版。这样的话,你需要在模板文件的顶部添加如下的声明::
>
```
{% load url from future %}
......@@ -382,7 +382,7 @@ url(r'^specifics/(?P<poll_id>\d+)/$', views.detail, name='detail'),
## URL 名称的命名空间 ##
本教程中的项目只有一个应用:``polls`` 。在实际的 Django 项目中,可能有 5、10、20 或者 更多的应用。Django 是如何区分它们的 URL 名称的呢?比如说,``polls`` 应用有一个 detail 视图,而可能会在同一个项目中是一个博客应用的视图。Django 是如何知道 使用 {% url %} 模板标记创建应用的 url 时选择正确呢?
本教程中的项目只有一个应用:``polls`` 。在实际的 Django 项目中,可能有 5、10、20 或者 更多的应用。Django 是如何区分它们的 URL 名称的呢?比如说,``polls`` 应用有一个 detail 视图,而可能会在同一个项目中是一个博客应用的视图。Django 是如何知道 使用 `{% url %}` 模板标记创建应用的 url 时选择正确呢?
答案是在你的 root URLconf 配置中添加命名空间。在 mysite/urls.py 文件 (项目的 ``urls.py``,不是应用的) 中,修改为包含命名空间的定义:
......
......@@ -23,9 +23,9 @@
简单的总结下:
+ 上面的模板中为每个投票选项设置了一个单选按钮。每个单选按钮的 value 是投票选项对应的 ID 。每个单选按钮的 name 都是 ``“choice”``。这意味着,当有人选择了一个单选按钮并提交了表单,将会发送 的 POST 数据是 ``choice=3``。这是 HTML 表单中的基本概念。
+ 我们将 form 的 action 设置为 {% url 'polls:vote' poll.id %}``,以及设置了 ``method="post" 。使用 method="post" ( 而不是 method="get") 是非常重要的,因为这种提交表单的方式会改变服务器端的数据。 当你创建一个表单为了修改服务器端的数据时,请使用 method="post" 。这不是 Django 特定的技巧;这是优秀的 Web 开发实践。
+ 我们将 form 的 action 设置为 `{% url 'polls:vote' poll.id %},以及设置了 `method="post"` 。使用 method="post" ( 而不是 method="get") 是非常重要的,因为这种提交表单的方式会改变服务器端的数据。 当你创建一个表单为了修改服务器端的数据时,请使用 method="post" 。这不是 Django 特定的技巧;这是优秀的 Web 开发实践。
+ forloop.counter 表示 for 标签在循环中已经循环过的次数
+ 由于我们要创建一个POST form ( 具有修改数据的功能 ),我们需要担心跨站点请求伪造 ( Cross Site Request Forgeries )。 值得庆幸的是,你不必太担心这一点,因为 Django 自带了一个非常容易使用的系统来防御它。 总之,所有的 POST form 针对内部的 URLs 时都应该使用 {% csrf_token %} 模板标签。
+ 由于我们要创建一个POST form ( 具有修改数据的功能 ),我们需要担心跨站点请求伪造 ( Cross Site Request Forgeries )。 值得庆幸的是,你不必太担心这一点,因为 Django 自带了一个非常容易使用的系统来防御它。 总之,所有的 POST form 针对内部的 URLs 时都应该使用 `{% csrf_token %}` 模板标签。
现在,让我们来创建一个 Django 视图来处理提交的数据。 记得吗?在 教程 第3部分 中,我们为 polls 应用创建了一个 URLconf 配置中包含有这一行代码:
......
......@@ -38,7 +38,7 @@ polls/templates/polls/index.html
<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />
```
{% load staticfiles %} 从staticfiles模板库加载{% static %} 模板标签。{% static %}模板标签会生成静态文件的绝对URL。
`{% load staticfiles %}` 从staticfiles模板库加载`{% static %}` 模板标签。`{% static %}`模板标签会生成静态文件的绝对URL。
这就是你在开发过程中,所需要对静态文件做的所有处理。 重新加载 http://localhost:8000/polls/ ,你应该会看到Question的超链接变成了绿色(Django的风格!),这意味着你的样式表被成功导入。
......@@ -59,7 +59,7 @@ body {
> 警告:
>
> 当然,{% static %}模板标签不能用在静态文件(比如样式表)中,因为他们不是由Django生成的。 你应该永远使用相对路径来相互链接静态文件,因为这样你可以改变STATIC_URL ( static模板标签用它来生成URLs)而不用同时修改一大堆静态文件的路径。
> 当然,`{% static %}`模板标签不能用在静态文件(比如样式表)中,因为他们不是由Django生成的。 你应该永远使用相对路径来相互链接静态文件,因为这样你可以改变STATIC_URL ( static模板标签用它来生成URLs)而不用同时修改一大堆静态文件的路径。
这些知识基础。关于静态文件设置的更多细节和框架中包含的其它部分,参见静态文件 howto 和静态文件参考。部署静态文件讨论如何在真实的服务器上使用静态文件。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册