前言: 各位久等了,django进阶篇来了。
一、get与post
接口规范: url不能写动词,只能写名词
django默认只支持两种方式: get, post
get是获取数据
?user=zcl&password=abc&email=669@qq
?号表示后面是参数,&在两参数中间
request.GET.get("password")
上面这句代码可获取密码abc,是明文的!!
post获取密码是密文的。post请求用于创建或修改数据。
if request.method == 'GET':
# <view logic>
return HttpResponse('result')
二、模版渲染
你可能已经注意到我们在例子视图中返回文本的方式有点特别。 也就是说,HTML被直接硬编码在 Python 代码之中。
1 def current_datetime(request):
2 now = datetime.datetime.now()
3 html = "<html><body>It is now %s.</body></html>" % now
4 return HttpResponse(html)
尽管这种技术便于解释视图是如何工作的,但直接将HTML硬编码到你的视图里却并不是一个好主意。 让我们来看一下为什么:
- 对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。 站点设计的修改往往比底层 Python 代码的修改要频繁得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多。
- Python 代码编写和 HTML 设计是两项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员(甚至不同部门)来完成。 设计者和HTML/CSS的编码人员不应该被要求去编辑Python的代码来完成他们的工作。
- 程序员编写 Python代码和设计人员制作模板两项工作同时进行的效率是最高的,远胜于让一个人等待另一个人完成对某个既包含 Python又包含 HTML 的文件的编辑工作。
基于这些原因,将页面的设计和Python的代码分离开会更干净简洁更容易维护。 我们可以使用 Django的 模板系统 (Template System)来实现这种模式。
Django模版基本语法
1 >>> from django.template import Context, Template
2 >>> t = Template('My name is {{ name }}.')
3 >>> c = Context({'name': 'Stephane'})
4 >>> t.render(c)
5 u'My name is Stephane.'
同一模板,多个上下文: 一旦有了 模板 对象,你就可以通过它渲染多个context
1 >>> from django.template import Template, Context
2 >>> t = Template('Hello, {{ name }}')
3 >>> print t.render(Context({'name': 'John'}))
4 Hello, John
5 >>> print t.render(Context({'name': 'Julie'}))
6 Hello, Julie
7 >>> print t.render(Context({'name': 'Pat'}))
8 Hello, Pat
无论何时我们都可以像这样使用同一模板源渲染多个context,只进行 一次模板创建然后多次调用render()方法渲染(render)会更为高效:
1 # Bad
2 for name in ('John', 'Julie', 'Pat'):
3 t = Template('Hello, {{ name }}')
4 print t.render(Context({'name': name}))
5
6 # Good 生成模版实例是有系统开销的,一个模版实例是可以进行多次上下文的渲染
7 t = Template('Hello, {{ name }}')
8 for name in ('John', 'Julie', 'Pat'):
9 print t.render(Context({'name': name}))
注意: 如果没有python manage.py shell 是会曝错的!!这句代码的意义是导入django环境。
三、深度变量的查找
在到目前为止的例子中,我们通过 context 传递的简单参数值主要是字符串,然而,模板系统能够非常简洁地处理更加复杂的数据结构,例如list、dictionary和自定义的对象。
在 Django 模板中遍历复杂数据结构的关键是句点字符 (.)。
向模板传递一个 Python 字典。 要通过字典键访问该字典的值,可使用一个句点:
1 >>> from django.template import Template, Context
2 >>> person = {'name': 'Sally', 'age': '43'}
3 >>> t = Template('{{ person.name }} is {{ person.age }} years old.')
4 >>> c = Context({'person': person})
5 >>> t.render(c)
6 u'Sally is 43 years old.'
同样,也可以通过句点来访问对象的属性。 比方说, Python 的 datetime.date 对象有 year 、 month 和 day 几个属性,你同样可以在模板中使用句点来访问这些属性:
1 >>> from django.template import Template, Context
2 >>> import datetime
3 >>> d = datetime.date(1993, 5, 2)
4 >>> d.year
5 1993
6 >>> d.month
7 5
8 >>> d.day
9 2
10 >>> t = Template('The month is {{ date.month }} and the year is {{ date.year }}.')
11 >>> c = Context({'date': d})
12 >>> t.render(c)
13 u'The month is 5 and the year is 1993.'
句点也可用于访问列表索引,例如:
1 >>> from django.template import Template, Context
2 >>> t = Template('Item 2 is {{ items.2 }}.')
3 >>> c = Context({'items': ['apples', 'bananas', 'carrots']})
4 >>> t.render(c)
5 u'Item 2 is carrots.'
四、隔行更换背景颜色
效果图(太牛啦):
输入url通过路由调用index方法:
1 def index(request):
2 if request.method == "GET":
3 user_info = [{"username":"zcl_1","name":"zhang CL",},
4 {"username": "zcl_2", "name": "zhang CL", },
5 {"username": "zcl_3", "name": "zhang CL", },
6 {"username": "zcl_4", "name": "zhang CL", },
7 {"username": "zcl_5", "name": "zhang CL", },]
8
9 return render(request, "app01/index.html", {"user_objs":user_info})
app01/index.html下部分代码:
1 <ul>
2 {% for user_obj in user_objs %}
3 {# {% if forloop.counter0 > 2 %}#}
4 {% if forloop.counter0|divisibleby:"2" %}
5 <li style="background-color: darksalmon">username:{{ user_obj.username }};name:{{ user_obj.name }}</li>
6 {% else %}
7 <li style="">username:{{ user_obj.username }};name:{{ user_obj.name }}</li>
8 {% endif %}
9 {% endfor %}
10 </ul>
注意: forloop.counter0表示循环从0开始,divisibleby:"2"表示能被2整除的。PS: 千万不要写成divisibleby: "2"(中间加个空格,会曝错的!!当时我就加了空格,出错时一脸懵比...)
五、模版的继承与复用
Templates/app01/page1.html文件:
1 <body>
2 {% extends "app01/index.html" %} {#继承父模版#}
3 <h1>page1</h1>
4 </body>
5
6 Templates/app01/index.html文件:
7 <body>
8 <ul>
9 <li style="display: inline">Home</li>
10 <li style="display: inline">page1</li>
11 <li style="display: inline">page2</li>
12 <li style="display: inline">page3</li>
13 </ul>
14 <h1>welcome to payment index</h1>
15
16 <footer>
17 <h1>foot</h1>
18 </footer>
19 </body>
Templates/app01/index.html文件:
1 <body> 2 <ul> 3 <li style="display: inline">Home</li> 4 <li style="display: inline">page1</li> 5 <li style="display: inline">page2</li> 6 <li style="display: inline">page3</li> 7 </ul> 8 <h1>welcome to payment index</h1> 9 10 <footer> 11 <h1>foot</h1> 12 </footer> 13 </body>