首页 > 其他分享 >模板层之标签、自定义过滤器、标签及inclusion_tag(了解)、模板的继承与导入、模型层之前期准备、ORM常用关键字

模板层之标签、自定义过滤器、标签及inclusion_tag(了解)、模板的继承与导入、模型层之前期准备、ORM常用关键字

时间:2022-12-14 21:25:03浏览次数:55  
标签:__ name 自定义 标签 django html 模板 页面

模板层之标签(类似于python流程控制)

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

1.if判断

{% if 条件 %}   # 条件一般是模板语法传过来的数据  直接写名字使用即可
    条件成立执行的代码
{% elif 条件1 %}
    条件1成立执行的代码
{% else %}
    条件都不成立执行的代码
{% endif %}

2.for循环

{% for k in t1 %}
        {% if forloop.first %}
            <p>这是我的第一次循环{{ k }}</p>
        {% elif forloop.last %}
            <p>这是我的最后一次循环{{ k }}</p>
        {% else %}
            <p>这是中间循环{{ k }}</p>
        {% endif %}
        
        {% empty %}
            <p>你给我传的数据是空的无法循环取值(空字符串、空列表、空字典)</p>
{% endfor %}


forloop关键字:{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}
# counter0:从0开始计数;counter:从一开始计数;first': 是否是第一次循环;last是否是最后异常循环

补充:如果数据是字典,同样提供了keys、values、items方法。

a={'name':jason,'age':18}
{{ for i in a.keys}} 
 <p>{{ i }}</p> # name age 
{% endfor %}
{{ for i in a.values}} 
 <p>{{ i }}</p> # jason 18 
{% endfor %}
{{ for i in a.items}} 
 <p>{{ i }}</p> # ('name',jason) ('age',18)
{% endfor %}
django模板语法取值操作>>>:只支持句点符
    句点符既可以点索引也可以点键
	 {{ d1.hobby.2.a1 }}
        
{% with d1.hobby.2.a1 as h %}  复杂数据获取之后需要反复使用可以起别名
        <a href="">{{ h }}</a>
{% endwith %}

自定义过滤器、标签及inclusion_tag(了解)

"""
如果想要自定义一些模板语法 需要先完成下列的三步走战略
	1.在应用下创建一个名字必须叫templatetags的目录
	2.在上述目录下创建任意名称的py文件	
	3.在上述py文件内先编写两行固定的代码
		from django import template
		register = template.Library()
"""

自定义过滤器(最大只能接收两个参数)

@register.filter(name='myfilter') # 括号内可以通过name给过滤器取别名
def my_add(a, b):
    return a + b

# 在html页面使用过滤器需要先导入创建的py文件模块
{% load mytag %}
{{ i|myfilter:1 }}

自定义标签:可以接收任意参数(参数没有限制)

@register.simple_tag(name='mytag')
def func2(a, b, c, d, e):
    return f'{a}-{b}-{c}-{d}-{e}'
# 在html页面
{% load mytags %}
{% mytag 'jason' 'kevin' 'oscar' 'tony' 'lili' %} # 参数之间空格隔开即可

自定义inclusion_tag(局部的html代码)

@register.inclusion_tag(filename='it.html')
def index(n):
    html = []
    for i in range(n):
        html.append('第%s页'%i)
    return locals()
#it.html里内容
<ul>
    {% for i in html %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>
'''该方法需要先作用于一个局部html页面 之后将渲染的结果放到调用的位置 类似于封装了一个能够快速产生html代码的方法'''

{% load mytag %}
{% index 10 %}

模板的继承与导入

类似于面向对象的继承:继承了某个页面就可以使用该页面上所有的资源。

如果我们想要继承获取一个页面的大部分只修改一部分代码,我们也可以用继承来实现。

方式1:传统的复制粘贴

方式2:模板的继承

母页面

1.在模板中使用block划定子板以后可以修改的区域
      {% block 区域名称 %}
      {% endblock %}

子页面

{% extends 'html文件名' %} # html文件名是母页面的HTML文件名,继承了母页面

{% block 名字 %}  # 这里写的内容可以直接修改母页面里可以被修改的区域
    子板内容
{% endblock %}

'''子板中还可以使用母板的内容  {{ block.super }} '''

模板上最少应该有三个区域可以让子页面继承:css区域、内容区域、js区域。子页面就可以有自己独立的css、js、内容

{% block css %}
    css修改内容
{% endblock %}

{% block 名字 %}
    子板内容
{% endblock %}

{% block js %}
    js修改内容
{% endblock %}

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

{{ block.super }}

模板的导入(了解)

将某个html的部分提前写好 之后很多html页面都想使用就可以导入
{% include 'myform.html' %}

模型层之前期准备

表查询数据准备及测试环境搭建

django自带一个sqlite3小型数据库,该数据库功能非常有限并且针对日期类型的数据兼容性很差。所以我们习惯切换成常见的数据库比如MySQL django orm并不会自动帮你创建库 所以需要提前准备好

日期字段:modles.DateField()

# 年月日
参数:atuo_now    每次操作数据并保存都会自动更新当前时间
参数:auto_now_add    在数据被创建出来的那一刻会自动记录当前时间,之后在不人为修改的情况下保存不变
edit_time = modles.DateField(atuo_now=True或auto_now_add=True)

1.django切换MySQL数据库

2.定义模型类

class User(models.Model):
    uid = models.AutoField(primary_key=True, verbose_name='编号')  # verbose_name是注释起名字
    name = models.CharField(max_length=32, verbose_name='姓名')
    age = models.IntegerField(verbose_name='年龄')
    join_time = models.DateTimeField(auto_now_add=True)

3.执行数据库迁移命令(模型类>>>表)

python38 manage.py makemigrations
python38 manage.py migrate

4.模型层测试环境准备(单独测试django某个功能层)

默认不允许单独测试某个py文件  如果想要测试某个py文件(主要models.py)

测试环境1:pycharm提供的python console:

python console 命令行测试环境
python console自带测试环境

测试环境2:自己搭建(自带的test或者自己创建)

1.拷贝manage.py前四行
2.自己再加两行
    import django
    django.setup()
import os

def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'moxingceng.settings')
    import django
    django.setup()

    from app01 import models
    models.User.objects.filter()


if __name__ == '__main__':
    main()

查看ORM底层SQL语句

方式1:

如果是Queryset对象,那么可以直接点query查看SQL语句

方式2:

配置文件配置、打印所有的ORM操作对应的SQL语句、直接拷贝使用即可

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

ORM常用关键字

创建数据

1.create() 创建数据并直接获取当前创建的数据对象

models.User.objects.create(name='jason',age=18)

方式2:还可以利用类实例化对象然后调用save方法创建

user_obj = models.User(name='jason', age=18)
user_obj.save()  # 保存对象到User表中

查询数据

需要注意事项:

①当需要查询数据主键字段值的时候可以使用pk忽略掉数据字段真正的名字

②在模型类中可以定义一个__ str__方法便于后续数据对象被打印展示的是查看方便

③Queryset中如果是列表套对象那么直接for循环和索引取值但是索引不支持负数

④虽然queryset支持索引但是当queryset没有数据的时候索引会报错、推荐使用first

# __str__方法是对象被执行打印(print、页面展示、数据查询)操作的时候自动触发
def __str__(self):
    return f'对象:{self.name}'  # __str__方法必须要返回一个字符串类型的数据

image
image

标签:__,name,自定义,标签,django,html,模板,页面
From: https://www.cnblogs.com/wxlxl/p/16983555.html

相关文章