• python自动化学习笔记之DAY18


    MTV之模板层(template)

    Python的模板:HTML代码+模板语法

    模板包括在使用时会被值替换掉的变量,和控制模板逻辑的标签

    1、在Django模板中遍历复杂数据结构的关键是句点字符 .,句点符也可以引用对象的方法

    语法:

      {{var_name}}

    template:

      <h4>{{s}}</h4>

      <h4>列表:{{1.0}}</h4>

      <h4>字典:{{dic.name}}</h4>

      <h4>日期:{{date.year}}</h4>

      <h4>类对象列表:{{person_list.0.name}}</h4>

    2、模板之过滤器

    语法:

      {{obj | filter_name:param}}

    (1)、date

    value=datetime.datetime.now()

    {{ value | date:“Y-m-d”}}

    (2)、default

    如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。

    {{ value | default:“nothing”}}

    (3)、truncatechars

    如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将可以翻译的省略号序列(“...”)结尾。

    参数:要截断的字符数

    例如:

      {{ value | truncatechars:9}}

    如果value“Joel 是 >,输出将为“Joel i ...”

    3、模板之标签

    for标签

    for循环,遍历每一个元素

    { % for person in person_list % }

      <p>{{ person.name }}</p>

    {% endfor %}

    for标签带有一个可选的{% empty %}从句,在给出的组为空或者没有找到时,返回给界面的

    {% for person in person_list %}

      <p>{{ person.name }}</p>

    {% empty %}

      <p>sorry,no person here </p>

    {% endfor %}

    if标签

    {% if %}会对一个变量求值,如果它的值是“True”(存在,不为空,且不是Boolean类型的false值),对应的内容块会输出

    { % if num > 100 or num <0 %}

      <p>无效</p>

    { % elif num > 80 or num <100 %}

      <p>优秀</p>

    {% else %}

      <p>一般</p>

    {% endif %}

    csrf_token:提交数据时,需要使用 ,用于跨站请求伪造保护

    4、自定义标签和过滤器

    (1)、在settings中的INSTALLED_APPS配置当前app,否则Django找不到自定义的simple_tag

    (2)、在app中创建templatetags模板

     (3)、创建任意.py文件,如:my_tags.py

    from django import template
    from django.utils.safestring import mark_safe

    register = template.Library() # register的名字是固定的,不可改变

    @register.filter   # 定义过滤器
    def multi(x,y):

    return x*y


    @register.simple_tag   # 定义标签
    def multi_tag(x,y,z):
    return x*y*z

      

    (4)、在使用自定义simple_tag和filter的html文件中导入之前创建的my_tags.py

      {% load my_tags %}

    (5)、调用simple_tag和filter

      { % load xxx % }

       {{ num | filter_multi:2 }}       #num=12,返回界面的值:24

    5、模板继承(extend)

    模板继承:最大程度上实现代码复用,减少代码重复

    需要先创建一个基本的“骨架”模板,他包含站点中全部元素,并且能被子模板覆盖的blocks

     先定义母版:比如:base.html

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title></title>
    </head>
    <body>
    <div id="side">
    {% block side %}
    <ul>
    <li><a href="/">Home</a></li>
    <li><a href="/">Blog</a></li>
    </ul>
    {% endblock %}
    </div>

    <div id="content">
    {% block content %}{% endblock %}
    </div>
    </body>
    </html>

    “子模板”工作是用它们的内容填充空的blocks。

     block 标签定义了两个可以被子模版内容填充的block。 block 告诉模版引擎: 子模版可能会覆盖掉模版中的这些位置

    子模板

    {% extends "base.html" %}

    {% block content %}
    {% for entry in blog_entries %}
    <h2>{{ entry.title }}</h2>
    <p>{{ entry.body }}</p>
    {% endfor %}
    {% endblock %}

    extends标签是这里的关键。它告诉模版引擎,这个模版“继承”了另一个模版。当模版系统处理这个模版时,它将定位父模版base.html

    继承注意事项:

    (1)、模版中使用的第一个标签必须是 {% extends %} 标签。其他的任何情况下,模版继承都将无法工作。

    (2)、在base模版中设置越多的 {% block %} 标签越好。请记住,子模版不必定义全部父模版中的blocks,所以,你可以在大多数blocks中填充合理的默认内容

    (3)、为了更好的可读性,你也可以给你的 {% endblock %} 标签一个 名字 。例如:


    {% block content %}
    ...
    {% endblock content %}  
    在大型模版中,这个方法帮你清楚的看到哪一个  {% block %} 标签被关闭了。

    (4)、不能在一个模版中定义多个相同名字的 block 标签。这个限制的存在是因为block标签的作用是“双向”的。这个意思是,block标签不仅提供了一个坑去填,它还在 _父模版_中定义了填坑的内容。如果在一个模版中有两个名字一样的 block 标签,模版的父模版将不知道使用哪个block的内容。

    model基础

    1、ORM映射关系

      表名—————类名

      字段—————属性

      表记录————类实例对象

    2、数据库中表与表的关系

    确定是什么关系

    if 一对多:

    关联字段放在多的一方;

    foreign key dep_id reference dep(id)

    if 多对多:

    创建第三章表

    create table student_teacher(

    id int primary key,

    student_id int,

    teacher_id int,

    foreign key student_id reference student(id)

    foreign key teacher_id reference teacher(id)

    )


    if 一对一:

    foreign key ,关联字段可以放在两张表中任意一张

    关联字段必须唯一约束

    3、ORM表关系:
    (1)、配置:
    DATABASES = {

    'default': {

    'ENGINE': 'django.db.backends.mysql',

    'NAME': 's18day18', #你的数据库名称

    'USER': 'root', #你的数据库用户名

    'PASSWORD': '', #你的数据库密码

    'HOST': '', #你的数据库主机,留空默认为localhost

    'PORT': '3306', #你的数据库端口

    }
    }


    (2)、 数据库引擎更改:
    MYsqlDB---->pymysql
    在应用的__init__文件中加入:

    import pymysql

    pymysql.install_as_MySQLdb()

    单表操作:
    # 插入数据
    # 插入数据方式1,create有返回值:插入的记录对象:
    book_obj=models.Book.objects.create(title=title,pubDate=pubdate,price=price,publish=publish)
    print(book_obj.title)
    print(book_obj.price)
    # 插入数据方式2:
    book_obj=models.Book(title=title,pubDate=pubdate,publish=publish)
    book_obj.price=price
    book_obj.save()

  • 相关阅读:
    网页加载进度条
    BFC
    Java — 基础语法
    Python — 多进程
    Python — 进程和线程
    Python — 面向对象进阶2
    Python — 面向对象编程基础
    Linnux 05
    Linnux 04
    Linnux 03
  • 原文地址:https://www.cnblogs.com/tangxiaof/p/7835344.html
Copyright © 2020-2023  润新知