关于django中模板的理解

2018/12/10 日课程总结

 

引子:不同于HttpResponse 返回的是一个字符串,后端开发自然是要返回的是一个页面。

首先在已经有html文件的情况下我们是如何将一个页面展示在页面呢。

  1. 首先新建一个templates的文件夹,目录最好与manage.py 文件同级
  2. 写好一个html文件放在其中
  3. 配置settings.py 文件

TEMPLATES:'DIRS': [os.path.join(BASE_DIR,"templates")],

  1. 下一步考虑如何渲染模板 这里提供了两种方法:

1. from django.template.loader import render_to_string

 from django.http import HttpResponse

 def index(request):

     html = render_to_string("index.html")

     return HttpResponse(html)

默认路径下找到模板,然后将模板编译后渲染成Python的字符串格式

2.from django.shortcuts import render

 def index(request):

     return render(request,'index.html')

 

直接将模板渲染成字符串和包装成HttpResponse对象一步到位完成.

 

Ps: render函数第一个参数与视图函数同样是requset 。

考虑两种方法中第三个可传参数的解释:

视图函数在使用render或者render_to_string的时候可以传递一个context的参数,这个参数是一个字典类型。以后在模板中的变量就从这个字典中读取值的

Example:

Index.html  代码

<p>{{ username }}</p>

# views.py 中的代码

def profile(request):

   Return render(request,'index.html',context={'username':'lilei'})

 

 

常用标签总结:

if标签:if标签相当于Python中的if语句,有elif和else相对应,但是所有的标签都需要用标签符号({%   %})进行包裹。if标签中可以使用==、!=、<、<=、>、>=、in、not in、is、is not等判断运算符。示例代码如下:

 

     {% if "张三" in persons %}

         <p>张三</p>

     {% else %}

         <p>李四</p>

     {% endif %}

 

1. 所有的标签都是在{%   %}之间。

2. if标签有闭合标签。就是{%  endif   %}。

3. if标签的判断运算符,就跟python中的判断运算符是一样的。==、!=、<、<=、>、>=、in、not in、is、is not这些都可以使用。

4. 还可以使用elif以及else等标签。

 

 

 

 

 

 

 

 

for...in...标签:for...in...类似于Python中的for...in...。可以遍历列表、元组、字符串、字典等一切可以遍历的对象。在index.html中示例代码如下:

 

    该行为变形内容:翻转(逆序遍历) {%  for  person  in  persons  reversed %}

    {% for person in persons %}

         <p>{{ person}}</p>

     {% endfor %}

 

遍历字典的时候,需要使用items、keys和values等方法。在DTL中,执行一个方法不能使用圆括号的形式。遍历字典示例代码如下:

 

     {% for key,value in person.items %}

         <p>key:{{ key }}</p>

         <p>value:{{ value }}</p>

     {% endfor %}

 

for...in...empty标签:这个标签使用跟for...in...是一样的,只不过是在遍历的对象如果没有元素的情况下,会执行empty中的内容。示例代码如下:

 

    {% for person in persons %}

        <li>{{ person }}</li>

    {% empty %}

        暂时还没有任何人

    {% endfor %}

 

模板中的for...in...没有continue和break语句,这一点和Python中有很大的不同,一定要记清楚!

 

 

 

 

with标签:在模版中定义变量。有时候一个变量访问的时候比较复杂,那么可以先把这个复杂的变量缓存到一个变量上,以后就可以直接使用这个变量就可以了。示例代码如下:

 

    context = {

        "persons": ["张三","李四"]

    }

    #在index.html中写

    {% with lisi=persons.1 %}

        <p>{{ lisi }}</p>

    {% endwith %}

 

有几点需要强烈的注意:

 

1. 在with语句中定义的变量,只能在{% with %}  {% endwith %}中使用,不能在这个标签外面使用。

2. 定义变量的时候,不能在等号左右两边留有空格。比如{% with lisi = persons.1%}是错误的。

 

还有另外一种写法同样也是支持的:

 

      {% with persons.1 as lisi %}

       <p>{{ lisi }}</p>

      {% endwith %}

 

 

 

 

 

url标签:在模版中,我们经常要写一些url,比如某个a标签中需要定义href属性。当然如果通过硬编码的方式直接将这个url写死在里面也是可以的。但是这样对于以后项目维护可能不是一件好事。因此建议使用这种反转的方式来实现,类似于django中的reverse一样。示例代码如下:

 

    <a href="{% url 'list' %}">图书列表页面</a>

 

如果url反转的时候需要传递参数,那么可以在后面传递。但是参数分位置参数和关键字参数。位置参数和关键字参数不能同时使用。示例代码如下:

 

         # path部分

         path('detail/<book_id>/',views.book_detail,name='detail')

        

         # url反转,使用位置参数

         <a href="{% url 'detail' 1 %}">图书详情页面</a>

        

         # url反转,使用关键字参数

         <a href="{% url 'detail' book_id=1 %}">图书详情页面</a>

    

 

如果想要在使用url标签反转的时候要传递查询字符串的参数,那么必须要手动在在后面添加。示例代码如下:

 

         <a href="{% url 'detail' book_id=1 %}?page=1">图书详情页面</a>

 

如果需要传递多个参数,那么通过空格的方式进行分隔。示例代码如下:

 

     <a href="{% url 'detail' book_id=1 page=2 %}">图书详情页面</a>

 

posted on 2018-12-10 20:24  我是夜雨吖  阅读(680)  评论(0编辑  收藏  举报

导航