模板、模板语法的过滤器、标签、自定义方法、数据库迁移命令

今日学习内容总结

模板语法

模板语法之过滤器

过滤器说明

    1. 类似于Python的内置方法

    2. 将竖杠左侧的数据当做第一个参数传给右边的过滤器

    3. 语法 : {{ [数据]|过滤器:可选参数 }}

    4. 注意 : 竖杠左右两边没有空格

    5. 过滤器参数包含空格的话需要使用引号包裹

    6. 过滤器最多只能有两个参数

语法结构

    {{ 数据对象|过滤器名称:参数 }}  过滤器最多只能额外传输一个参数

常用过滤器使用

      django模板语法提供了60+过滤器,我们了解常用过滤器就可以了。

    <p>统计数据的长度:{{ s1|length }}</p>
    
    <p>算术加法或者字符串加法:{{ n1|add:111 }}、{{ s1|add:'big baby' }}</p>
    
    <p>将数字转成合适的文件计量单位:{{ file_size|filesizeformat }}、{{ file_size1|filesizeformat }}</p>
    
    <p>判断当前数据对象对应的布尔值是否是False:{{ b|default:'前面的值对应的布尔值是False' }}、{{ s1|default:'前面的值对应的布尔值是False' }}</p>
    
    <p>时间格式化:{{ ctime|date:'Y-m-d' }}</p>
      
    <p>索引切片:{{ s1|slice:'0:8' }}</p>
    
    <p>按照空格截取指定个数的文本:{{ s2|truncatewords:5 }}、{{ s1|truncatewords:1 }}</p>
    
    <p>按照字符个数截取文本(包含三个点):{{ s2|truncatechars:5 }}、{{ s1|truncatechars:10 }}</p>
    
    <p>移除指定的字符:{{ info|cut:'|' }}</p>
    
    <p>是否取消转换:{{ tag1 }}、{{ tag1|safe }}、{{ scripts1|safe }}、{{ res }}</p>

      最后一个|safe启发了我们以后用django开发全栈项目前端页面代码(主要指HTML代码)也可以在后端编写:

    from django.utils.safestring import mark_safe
    html_safe = mark_safe('<h1>你好</h1>')

模板语法之标签

      在django模板语法中写标签的时候,可以只写关键字然后tab键就会自动补全。

语法结构

  {% 名字 ...%}

  {% end名字 %}

if判断

  {% if 条件1 %}
    <p>你好啊</p>
  {% elif 条件2 %}
    <p>他好呀</p>
  {% else %}
    <p>大家好</p>
  {% endif %}

for循环

      提供了forloop关键字

    {% for i in l %}
        <p>{{ forloop }}</p>
        <p>{{ i }}</p>  # 循环从列表 l 中取出一个个元素
    {% endfor %}

    # forloop 输出的是
    {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}

    counter0    索引
    counter     第一个元素
    revcounter  倒序第一个元素
    revcounter0 倒序索引
    first       是否是第一个元素
    last        是否是最后一个元素

for与if混合使用

    {% for i in l %}
        {% if forloop.first %}
            <p>is first</p>
        {% elif forloop.last %}
            <p>is last</p>
        {% else %}
            <p>{{ i }}</p>
        {% endif %}
    {% endfor %}

with : 取别名

    {% with ll.2.hobby.0 as hb %}
        <p>{{ hb }}</p>             # 可以使用别名取值
        <p>{{ ll.2.hobby.0 }}</p>   # 也可以使用原来的方式取值
    {% endwith %}

字典values、keys、items方法

    {% for k in d.keys %}
        <p>{{ k }}</p>
    {% endfor %}

    {% for v in d.values %}
        <p>{{ v }}</p>
    {% endfor %}

    {% for kv in d.items %}
        <p>{{ kv }}</p>
    {% endfor %}

自定义过滤器、标签、inclusion_tag

创建 templatetags 文件

    1. 首先在应用下创建一个名字必须叫"templatetags"文件夹
    
    2. 在改文件夹下创建一个任意名称的 py 文件 (例 : mytag)
    
    3. 在该 py 文件内固定书写两行代码
          from django import template
          register = template.Library()

自定义过滤器

      自定义过滤器最多只能有两个形参。

    from .templatetags.mytag import register

    # 在模板层导入自定义的过滤器时使用的是这里指定的名字
    @register.filter(name='myfilter')  
    def sums(a, b):   # 函数名随便起什么
        return a + b  # 返回两个参数的和
    {% load mytag %}  # 导入tag文件
    <p>{{ i|myfilter:100 }}</p>  # 使用myfilter过滤器

自定义标签

      自定义标签可以接收任意的参数。

    from .templatetags.mytag import register

    # 在模板层导入自定义的标签时使用的是这里指定的名字
    @register.simple_tag(name="my_tag")
    def my_join(a,b,c,d):          # 函数名任意
        return f'{a}/{b}/{c}/{d}'  # 返回参数拼接后的结果

    {% load mytag %}  # 导入tag文件
    <p>{% my_tag 'hello' 'pai' 'da' 'xing' %}</p>  # 标签之后的多个参数彼此之间用空格隔开

    # 自定义inclusion_tag
    from .templatetags.mytag import register

    @register.inclusion_tag('test.html',name='my_incl_tag')  # 第一个参数是需要渲染的HTML页面
    def func(n):
        data=[]
        for i in range(n):
            data.append(f'第{i}页')
        return locals()

    # test.html 文件
    {% load mytag %}
    <p>{% my_incl_tag 6 %}</p>

    # test2.html
    {{ data }}
    {% for foo in data %}
        {% if forloop.first %}
            <p>{{foo}}</p>
        {% elif forloop.last %}
            <p>{{ foo }}</p>
        {% else %}
            <p>{{ foo }}</p>
        {% endif %}
    {% endfor %}

      该方法需要先作用于一个局部html页面,之后将渲染的结果放到调用的位置。内部原理:

    1. 在HTML页面中导入写好的 inclusion_tag 并调用了

    2. 触发了py文件中一个函数的执行并产生结果
  
    3. 产生的结果通过模板语法传递给一个HTML页面进行渲染

    4. 渲染完毕后又返回调用 inclusion_tag 的位置

      test.html 页面中调用了 inclusion_tag----->触发执行了一个函数产生结果并渲染到 test2.html 页面中, 渲染完又返回 test.html 页面。

模板

模板的导入

      类似于将html页面上的局部页面做成模块的形式 ,哪个地方想要直接导入即可展示。

    {% include 'edit.html' %}  # 直接在当前HTML文件里面显示 edit.html 文件的内容

    <!---->  是HTML的注释语法
    {##}		 是django模板语法的注释
    
    HTML的注释可以在前端浏览器页面上直接查看到
    模板语法的注释只能在后端查看 前端浏览器查看不了

模板的继承

模板继承的使用

      模板的继承首先需要选择一个模板页面, 在该页面里面使用 block 划定可以被更改的区域:

    # 母板页面 'home.html' 文件
    {% block [区域名称] %}
    ......
    {% endblock %}

      想要继承的页面可以使用 extends 来继承某一个页面。

    # 子版
    {% extends 'home.html' %}
    {% block [区域名称] %}
    ......
    {% endblock %}

      子版继承了模板, 那么子版的整体格式与模板一样, 被 block 划分了的区域可以自己随意更改。

      子页面还可以重复使用父页面的内容。

    {{ block.super }}

模板的三个区域

      模板上最少应该有三个区域:

    {% block css %}
        # css区域
    {% endblock %}

    {% block content %}
        # HTML区域
    {% endblock %}

    {% block js %}
        # js区域
    {% endblock %}

      目的是为了让子版具有独立的css、js等,增加扩展性。

数据库迁移命令

      1.数据库正向迁移命令(将类操作映射到表中)
      	python3 manage.py makemigrations
        python3 manage.py migrate
      2.数据库反向迁移命令(将表映射成类)
	python3 manage.py inspectdb

      主要用于操作已经存在的表,将映射出来的类写入models.py即可。

测试环境搭建

      当我们只想操作orm,不想使用网络请求时,需要有专门的测试环境。

    	import os
	    if __name__ == "__main__":
        	os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.settings")
        	import django
        	django.setup()
    2.pycharm提供
    	python console
posted @ 2022-05-16 20:39  くうはくの白  阅读(48)  评论(0)    收藏  举报