This theme is built with awescnb.|

模板语法过滤器,模板语法标签,自定义过滤器、标签、inclusion_tag,模板继承,模板导入,搭建测试环境,ORM关键字使用

过滤器

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

过滤器
        <p>前端统计字符串的长度:{{ s|length }}</p>
        <p>算术加法或者字符串加法:{{ n1|add:111 }}、{{ s1|add:'big baby' }}</p>
        <p>前端获取数据如果是空就返回default后面默认的参数值:{{ flag|default:'你这个东西是个空'}}</p>
        <p>将数字格式化成表示文件大小的单位:{{ file_size|filesizeformat }}</p>
        <p>{{ ctime }}</p>
        <p>格式化时间(不要加百分号){{ ctime|date:'Y-m-d' }}</p>
        <p>字符串的切片操作:{{ res|slice:'0:8' }}</p>
        <p>{{ res|slice:'0:8:2' }}</p>

        <p>移除指定的字符:{{ info|cut:'|' }}</p>

        <p>截取固定的长度的字符串 三个点也算:{{ s|truncatechars:10 }}</p>

        <p>按照空格截取文本内容:{{ res|truncatewords:4 }}</p>
        <p>{{ s|truncatewords:4 }}</p>

        <p>{{ 'hahah'|add:'heheheh' }}</p>

        {#重点#}
        <p>{{ ht }}</p>
        <p>{{ sr }}</p>
        <p>{{ ht|safe }}</p>
        <p>{{ sr|safe }}</p>
        
    
    前后端取消转义(*****)
        前端:
            |safe
        后端:
            from django.utils.safestring import mark_safe
            xxx = mark_safe('<h1>我是h1标签</h1>')

模板语法标签

for

#基本格式
{% for 变量 in 值 %} 
	{{循环体}}
{% endfor %}

#后端传来的数据list_  = ['aa', 'bb', 'cc', 'dd', 'dd']

{% for i in list_  %}   
      <p> {{ i }} </p>         
{% endfor %}

{% for foo in list_ %}
        <p>
            {{ forloop.counter0 }} {{ forloop.counter }}
            {{ forloop.revcounter0 }} {{ forloop.revcounter }}
            {{ forloop.first }} {{ forloop.last }}
        </p>

{% endfor %}

if

#基本格式
{% if判断语句 %}
	if表达式为真执行的代码块
{% elif 条件 %}
	if表达式为真执行的代码块
{% else %}
	所有条件都不满足执行的代码块
{% endif %}


{% if num >= 18 %}
	<p>成年了</p>
{% elif num < 18 %}
	<p>未成年</p>
{% else %}
	<p>年龄写错了</p>
{% endif %}

for+if

{% for foo in s %}
    {% if forloop.first %}
        <p>这是第一次循环</p>
    {% elif forloop.last %}
        <p>这是最后一次</p>
    {% else %}
        <p>继续!!!</p>
    {% endif %}
    {% empty %}
        <p>传递过来的数据是空的</p>
{% endfor %}

自定义过滤器,标签

必须步骤:
1.在app应用下创建一个名字叫templatetags文件夹。
2.在该文件夹内创建一个任意名称的.py文件
3.在该py文件内必须写下两个语句
	from django import template
	register = template.Library()
4. 前端先使用{% load 自动模板语法文件的名字 %}
5. {{ 变量名|name指定名字(过滤器名字) }} 中 使用

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

my_filter.py文件中:
  from django import template
  register = template.Library()
  @register.filter(is_safe=True)
  def addto(a, b):
      return a + b
index.html中:
  {% load my_filter %}
  {{ s1|addto:10}} # 会将s1和10传入到自定义的过滤器中。

标签( 自定义简单标签:可以接收任意的参数)

类似于自定义函数
my_filter.py文件中:
  from django import template
  register = template.Library()
  @register.simple_tag(name='my_tag')
  def func1(a, b, c, d):
      return a + b + c + d

index.html中:
  {% load my_filter %}
  {% my_tag 1 2 3 4 %}  # 参数之间空格隔开即可

自定义inclusion_tag

my_filter.py文件中:
  from django import template
  register = template.Library()
  @register.inclusion_tag('tag.html') # tag.html为模板网页
  def func2(n):
      l1 = []
      for i in range(1, n + 1):
          l1.append(f'第{i}页')
      return locals() # 将参数传入tag.html中
index.html中:(页面中必须得有内容,不然会报错,不能只有模板语法)
  <p>1</p>
  {% load my_files %}
  {% func2 10 %}

tag.html中:(只需要样式,不需要head,body等等)
  <ul>
    {% for foo in l1 %}
        <li>{{ foo }}</li>
    {% endfor %}
  </ul>

模板的导入

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

eg:有一个非常好看的获取用户数据的页面 需要在网站的多个页面上使用
    策略1:拷贝多份即可
    策略2:模板的导入
   
使用方式
	{% include 'menu.html' %}

模板继承

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

模板页面 models.html
先在模板中通过block划定将来可以被修改的区域
{% block 名字 %}         
	可能需要替换的区域
{% endblock %}

子页面 xxx.html
{% extends 'models.html' %}  继承模板页面
{% block 名字 %}        引用
 	写新的代码替换
{% endblock %}
子页面还可以重复使用父页面的内容
	{{ block.super }}
"""
模板上最少应该有三个区域
	css区域、内容区域、js区域
子页面就可以有自己独立的css、js、内容
"""
{% block css %}         
	被替换的区域
{% endblock %}

{% block content %}         
	被替换的区域
{% endblock %}

{% block js %}         
	被替换的区域
{% endblock %}

数据库操作

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

搭建测试环境

1.自己搭建(tests.py)
    	import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoProject1.settings")
    import django
    django.setup()
2.pycharm提供
    	python console

ORM关键字使用

查找数据
    # res = models.User.objects.all()  # 查询所有的数据                          QuerySet 可以看成是列表套对象
    # res = models.User.objects.filter()  # 括号内填写筛选条件 不写相当于all()      QuerySet 可以看成是列表套对象
    # res = models.User.objects.filter(pk=1)  # 想通过主键筛选数据 可以直接写pk 会自动定位到当前表的主键字段 无需你自己查看具体字段名称
    # res = models.User.objects.filter(pk=1)[0]  # 直接获取数据对象               QuerySet支持索引取值 但是django不推荐使用 因为索引不存在会直接报错
    # res = models.User.objects.filter(pk=1).first()  # 获取结果集中第一个对象     推荐使用封装的方法 不会出现索引超出范围报错的情况
    # res = models.User.objects.filter(pk=1, name='kevin').first()  # 括号内支持填写多个筛选条件 默认是and关系
    # res = models.User.objects.filter().filter().filter().filter().filter()  # 只要是QuerySet对象就可以继续点对象方法(类似于jQuery链式操作)
    # res = models.User.objects.filter().last()  # 获取结果集中最后一个对象

对结果进行字段筛选
    # res = models.User.objects.all().values('name','age')  # QuerySet 可以看成是列表套字典
    # res = models.User.objects.values('name','age')  # QuerySet 可以看成是列表套字典  指定字段 all不写也表示从所有数据中操作
    # res = models.User.objects.filter(pk=2).values('name')  # 可以看成是对结果集进行字段的筛选
    # res = models.User.objects.all().values_list('name', 'age')  # QuerySet 可以看成是列表套元组

去重distinct
    # res = models.User.objects.all().distinct()  # 数据对象中如果包含主键 不能去重
    # res = models.User.objects.values('name').distinct()

排序order_by
    # res = models.User.objects.order_by('age')  # 默认是升序
    # res = models.User.objects.order_by('-age')  # 该为降序
    # res = models.User.objects.order_by('age', 'pk')  # 也支持多个字段依次排序

    # res = models.User.objects.reverse()  # 不起作用
    # res1 = models.User.objects.order_by('age').reverse()  # 只有在order_by排序之后才可以
    # print(res1)
    # res = models.User.objects.order_by('age')

统计结果个数
    # res = models.User.objects.count()  

判断是否存在
    # res = models.User.objects.exists()
    # res = models.User.objects.filter(name='111').exists()  # 判断结果集中是否有数据 有返回True 没有返回False

本文作者:春游去动物园

本文链接:https://www.cnblogs.com/chunyouqudongwuyuan/p/16277694.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   春游去动物园  阅读(46)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开
  1. 1 生分 川青
生分 - 川青
00:00 / 00:00
An audio error has occurred.

生分 - 川青

词:莎子

曲:邵翼天

编曲:林亦

混音:罗杨轩

吉他:林亦

制作人:谢宇伦

监制:曾炜超/陈显

策划:+7

统筹:黄染染

出品:漫吞吞文化

『酷狗音乐人 • 星曜计划』

全方位推广,见证星力量!

「版权所有未经许可 不得商业翻唱或使用」

我们怎么变得那么生分

用了几年也没解开疑问

有些事你不提我也不问

在陌生与熟悉间找平衡

有些话一开口会伤人

有些话一开口会伤人

所以我选择默不作声

所以我选择默不作声

爱一个人

若甘愿陪衬

甘愿牺牲

也许换个名分

也不是没可能

我不怕在爱里做个蠢人

我不怕在爱里做个蠢人

也不怕爱过之后再分

也不怕爱过之后再分

爱一个人

有万种身份

万种可能

只是没想到

我们最后友人相称

我们怎么变得那么生分

我们怎么变得那么生分

连说话都要掌握好分寸

怕不注意流言

见缝插针

怕不小心我们

成陌生人

我们怎么变得那么生分

用了几年也没解开疑问

有些事你不提我也不问

在陌生与熟悉间找平衡

有些话一开口会伤人

有些话一开口会伤人

所以我选择默不作声

所以我选择默不作声

爱一个人

若甘愿陪衬

甘愿牺牲

也许换个名分

也不是没可能

我不怕在爱里做个蠢人

我不怕在爱里做个蠢人

也不怕爱过之后再分

也不怕爱过之后再分

爱一个人

有万种身份

万种可能

只是没想到我们最后

友人相称

我们怎么变得那么生分

连说话都要掌握好分寸

怕不注意流言见缝插针

怕不小心我们成陌生人

我们怎么变得那么生分

用了几年也没解开疑问

有些事你不提我也不问

在陌生与熟悉间找平衡

我们怎么变得那么生分

我们怎么变得那么生分

连说话都要掌握好分寸

怕不注意流言见缝插针

怕不小心我们成陌生人

我们怎么变得那么生分

用了几年也没解开疑问

有些事你不提我也不问

在陌生与熟悉间找平衡