模板层之标签(类似于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__方法必须要返回一个字符串类型的数据