• 模板语法之过滤器(类似于内置函数)

  • 模板语法之标签(类似于流程控制)

  • 自定义过滤器、标签、inclusion_tag

  • 模板的继承

  • 模板的导入

  • 测试环境搭建

     

 

 

模板语法之过滤器

1.语法结构
{{数据对象|过滤器名称:参数}} 过滤器最多只能额外传输一个参数
2.常见过滤器
统计数据的长度:{{s1|length}}
   算数加法或者字符串加法:{{n1|add:666}}
   将数字转成合适的文件计量单位:{{file_size|filesizeformat}}
   判断当前数据对象对应的布尔值是否是False:{{s1|default:'前面的值对应的布尔值是Flase'}}
   时间格式化:{{ctime|date:'Y-m-d'}}
   索引切片:{{s1|slice:'0:6'}}
   按照空格截取指定个数的文本:{{s1|truncatewords:5}}
   按照字符个数截取文本(包含三个点):{{s1|truncachars:6}}
   移除指定的字符:{{info|cut:'|'}}
   是否取消转换:{{ scripts1|safe }}
 
ps:最后一个|safe启发了我们以后用django开发全栈项目前端页面代码(主要指HTML代码)也可以在后端编写

模板语法之标签

"""
在django模板语法中写标签的时候 只需要写关键字然后tab键就会自动补全
"""
1.语法结构
{% 名字 ...%}
  {% end名字 %}
2.if判断
{% if 条件1 %}
   <p>在吗?</p>
  {% elif 条件2 %}
<p> 我爱你 </p>
  {% else %}
   <p> </p>
  {% endif %}
3.for循环
提供了forloop关键字
   forloop.counter 总是一个表示当前循环的执行次数的整数计数器。 这个计数器是从1开始的,所以在第一次循环时 forloop.counter 将会被设置为1。
  {% for item in todo_list %}
       <p>{{ forloop.counter }}: {{ item }}</p>
  {% endfor %}
forloop.counter0 类似于 forloop.counter ,但是它是从0计数的。 第一次执行循环时这个变量会被设置为0。
forloop.revcounter 是表示循环中剩余项的整型变量。 在循环初次执行时 forloop.revcounter 将被设置为序列中项的总数。 最后一次循环执行中,这个变量将被置1。
forloop.revcounter0 类似于 forloop.revcounter ,但它以0做为结束索引。在第一次执行循环时,该变量会被置为序列的项的个数减1。
forloop.first 是一个布尔值,如果该迭代是第一次执行,那么它被置为```` 在下面的情形中这个变量是很有用的:
System Message: WARNING/2 (<string>, line 1071); backlink
Inline literal start-string without end-string.
  {% for object in objects %}
      {% if forloop.first %}<li class="first">{% else %}<li>{% endif %}
      {{ object }}
       </li>
  {% endfor %}
forloop.last 是一个布尔值;在最后一次执行循环时被置为True。 一个常见的用法是在一系列的链接之间放置管道符(|
  {% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}
 
 """
for+if其他使用
{% for i in l1 %}
  {% if forloop.first %}
      <p>这是第一次循环</p>
  {% elif forloop.last %}
      <p>这是最后一次循环</p>
  {% else %}
      <p>中间循环</p>
  {% endif %}
  {% empty %}
      <p>for循环对象为空 自动执行</p>
{% endfor %}
"""
ps:针对字典同样提供了keys、values、items方法

自定义过滤器、标签、inclusion_tag

"""
1.在应用下需要创建一个名为templatetags的文件夹
2.在该文件夹内创建一个任意名称的py文件
3.在该py文件内需要先提前编写两行固定的代码
from django import template
register = template.Library()
"""
# 自定义过滤器:只能接收两个参数
@register.filter(is_safe=True)
   def index(a,b):
       retrun a + b
  {% load mytag %}
  {{ n1|index:123 }}
# 自定义简单标签:可以接收任意的参数
@register.simple_tag(name = 'my_tag')
def func1(a, b, c, d):
   return a + b + c +d
{% my_tag 1 2 3 4 %}  # 参数之间空格隔开即可

# 自定义including_tag
@register.inclusion_tag('left.html')
def func2(n):
   l1 = []
   for i in range(1, n+1):
       l1.append(f'第{i}页')
   return locals()
{% func2 10 %}
### left.html ###
<ul>
{% for foo in l1 %}
  <li>{{foo}}</li>
  {% endfor %}
</ul>
'''该方法需要先作用于一个局部html页面 之后将渲染的结果放到调用的位置'''

模板的导入

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

eg:有一个非常好看的获取用户数据的页面 需要在网站的对各页面上使用
策略1:拷贝多份即可
   策略2:模板的导入

使用方式
{% include 'menu.html' %}

注释语法补充

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

模板的继承

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

有很多网站的很多页面 其实都是差不多的 知识局部有所变化 模板的继承可以很好的实现需求

1.先在模板中通过block划定将来可以被修改的区域
{% block content %}
   <h1>主页内容<h1>
  {% endblock %}
2.子板继承模板
{% extends 'home.html' %}
3.修改划定的区域
{% block content %}
   <h1>登录内容</>
  {% endblock %}
4.子页面还可以重复使用父页面的内容
{{ block.super }}
"""
模板上最少应该有三个区域
css区域、内容区域、js区域
子页面就可以有自己独立的css、js、内容
"""

前期数据准备

"""
django自带的sqlite3数据库 功能很少 并且针对日期类型不精确

1.数据库正向迁移命令(将类操作作映射到表中)
python3 manege.py makemigrations
python3 manege.py migrate
2.数据库反向迁移命令(将表映射成类)
python3 manege.py inspectdb
"""
需求
我们只想操作orm 不想使用网络请求
   需要有专门的测试环境
   1.自己搭建
  import os
      if __name__ == "__main__":
 
os.environ.setdefault("DJANGO_SETTINGS_MODULE","xxx.settings")
import django
   django.setup()
   
   2.pycharm提供
  python console

all()和filter()方法

all()方法
models.nameid23.objects.all()得出的结果是列表套对象
<nameid23:namdid23 object>  <nameid23:namdid23 object> <nameid23:namdid23 object> <nameid23:namdid23 object>
all()查询所有的列表对象

filter()方法
models.nameid23.objects.filter()
后面不加任何条件进行判断的话返回的将会和ALL()一样
可以利用面向对象的自动打印字符串格式
在类后面加上
def __str__(self):
   return '对象:%s' % self.name
将返回的对象打印 该代码是自己添加 和数据库无关
res=models.nameid23.objects.filter(pk=1)
主键筛选数据是PK 会自动定位当前表的主键字段 无需自己查看字段名称
res=models.nameid23.objects.filter(pk=1)[0]为列表套对象的对象数据 queryset支持索引取值
res=models.nameid23.objects.filter(pk=1).first() 也可以使用自带的方法
res=models.nameid23.objects.filter(pk=1,name='jason').first()支持传多个参数 并且默认是and关系

ORM常见的关键字操作

res=models.nameid23.objects.all().values('name') # 可以看成列表套字典
也可以直接对主键操作
res=models.nameid23.objects.all().values('pk')
res=models.nameid23.objects.filter(pk=2).values('name') # 对字段做截取
res=models.nameid23.objects.all().values_list('name','age') # 看成是列表套元组
res=models.nameid23.objects.all().distict() # 数据对象中包含主键 则不能去重
res=models.nameid23.objects.order_by('排序的字段') # 按照字段从小到大的升序 默认是升序
res=models.nameid23.objects.order_by('-排序的字段') # 降序排列
* 也支持多个字段依次排序
res=models.nameid23.objects.order_by('排序的字段1,排序字段2')
res=models.nameid23.objects.exculde(name='jason') # 取反操作
reverse()
该功能需要配合order_by排序后才能操作
count 用于计数
res=models.nameid23.objects.count()
用于对结果集的个数统计
判断结果集中是否含有数据,结果返回布尔值
    res = models.Users.objects.filter(name='oscar').exists() # 有了就返回True,没有就返回False

 

 



 posted on 2022-05-16 23:42  鳗鱼的春天  阅读(152)  评论(0编辑  收藏  举报