前言: 各位久等了,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环境

django进阶-1

 

三、深度变量的查找

在到目前为止的例子中,我们通过 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.'

django进阶-1

 

四、隔行更换背景颜色

效果图(太牛啦):

django进阶-1

输入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>
View Code

相关文章:

  • 2021-08-05
  • 2022-01-09
猜你喜欢
  • 2022-12-23
  • 2021-08-04
  • 2022-12-23
  • 2021-07-01
  • 2021-11-22
相关资源
相似解决方案