• 关于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>

  • 相关阅读:
    CF492B
    CF570B
    CF401C
    CF1190B
    CF413C
    CF486B
    CF976B
    NOIP 2020 解题报告
    状态压缩DP
    区间DP
  • 原文地址:https://www.cnblogs.com/pythonyeyu/p/10098870.html
Copyright © 2020-2023  润新知