ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

模板语法之过滤器(类似于内置函数)、标签、自定义、模板继承、导入、测试环境搭建、ORM关键字使用

2022-05-16 23:34:48  阅读:164  来源: 互联网

标签:自定义 models res ORM filter objects User 模板


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

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

自定义过滤器、标签、inclusion_tag

模板的继承

模板的导入

测试环境搭建

ORM关键字使用

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

"""
 我们可以试着查看源码
"""
1、语法结构
'''{{  数据对象|过滤器名称:参数  }}'''
过滤器只能额外传一个参数

2、常见过滤器(django模板语法提供60+的顾虑器种类)
def index(request):
    l1 = 'h e l l o 你 是 t w o 臂 吗'
    n1 = 111
    file_size = 7328
    file_size1 = 43875380
    b = False
    from datetime import datetime
    d = datetime.today()
    l2 = '你 好 哇 窝 似 泥 叠 '
    l3 = '枯|藤|老|树|昏|鸦'
    tag1 = '<h1>这是一个h1标签</h1>'
    scripts1 = '<script>alert(123)</script>'
    from django.utils.safestring import mark_safe
    ttt = '<a href="http://www.7k7k.com"> 小朋友快来玩啊</a>'
    res = mark_safe(ttt)
    return render(request, 'index.html', locals())

<p>统计数据的长度
    {{ l1|length }}</p>
<p>算数加法或者字符串加法:
    {{ n1|add:222 }},{{ l1|add:'big baby' }}</p>
<p>将数字转换成何时到的文件计量单位:
    {{ file_size|filesizeformat }},  {{ file_size1|filesizeformat }}</p>
<p>判断当前数据对象对应的布尔值是否是False:
     {{ l1|default:'前面的值是False' }}、{{ b|default:'前面的值是False' }}</p>
<p>时间格式化:
{{ d|date:'Y-m-d' }}</p>
<p>索引切片:
    {{ l1|slice:'0:6' }}</p>
<p>按照空格截取指定个数的文本:
    {{ l2|truncatewords:4 }}</p>
<p>按照字个数截取文本(包含三个点):
    {{ l2|truncatechars:5 }}、{{ l1|truncatechars:10 }}</p>
<p>移除指定的字符串:
    {{ l3|cut:'|' }}</p>
<p>
{{ l2|join:'泥嚎' }}</p>
<p>是否取消转换:
    {{ tag1 }}、{{ tag1|safe }}、{{ scripts1|safe }}、{{ res }}</p>

  # 最后一个|safe启发 我们以后用Django开发全栈项目前端页面代码(主要是指HTML代码) 也可以在后端编写

image-20220516165505283

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

"""
django模板语法中写标签的时候,只需要写关键字然后tab键就会自动补全
"""
1、语法结构
{% 名字 ... %}
{% end名字 %}

2、if 判断
{% if 条件1 %}
     <p>泥嚎</p>
{% elif 条件2 %}
    <p>窝不好</p>
 {% else %}
    <p>嘿嗨嘿</p>
{% endif %}

3、for循环
l1 = [11,22, 33, 44, 55]
{% for re in l1 %}
    <p>{{ forloop }}</p>
{% endfor %}
# forloop对象
  	{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}
    
 4、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 %}

image-20220516172305770

image-20220516172352675

自定义过滤器、标签、inclusion_tag

"""
 1、在应用下需要创建一个名为templatetags的文件夹
 2、在该文件夹内创建一个任意名称的py文件
 3、在该py文件内需要先提前编写两行固定的代码
    from django import template
	register = template.Library()
"""

# 自定义过滤器 只能接收两个参数
@register.filter(is_safe=True)
def index(a, b):
    return a + b

# 自定义简单标签:接收任意的参数
@register.simple_tag(name='my_tag')
def func1(a, b, c, d):
    return a + b + c + d

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

image-20220516212814475

模板的导入

# 类似于将html页面上的局部页面做成模块的形式 哪个地方想要直接导入即可展示
方法一: 直接拷贝
方法二: 模板的导入
    使用方式
	{% include 'menu.html' %}

image-20220516213109955

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

image-20220516213212755

模板的继承

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

测试环境搭建

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

1.数据库正向迁移命令(将类操作映射到表中)
	python3 manage.py makemigrations
  python3 manage.py migrate
2.数据库反向迁移命令(将表映射成类)
	python3 manage.py inspectdb
"""
1、搭建专门的测试环境
import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.settings")
    import django
    django.setup()
# 还有一种pycharm提供的
最下面的:Python console
  • all()和filter()方法

all()
查看所有的数据

filter()
括号不写条件相当于all(),写了相当于where

filter(pk=1) 
使通过主键筛选数据,写pk会自动定位当前的主键字段

models.User.objects.filter().filter().filter().filter() 
只要是QuerySet对象 就可以一直点 链式操作

ORM关键字使用

res = models.User.objects.all()
# 查询所有的数据 可以看成列表套对象  [<User: User object>, <User: User object>...]

res = models.User.objects.filter()  
# 括号内填写筛选条件,不写相当于all [<User: 对象:owen>, <User: 对象:gavin>, <User: 对象:oscar>]

res = models.User.objects.filter(pk=1) 
# 使通过主键筛选数据,写pk会自动定位当前的主键字段

res = models.User.objects.filter(pk=1).first()  
# .first() 第一个对象  推荐使用

res = models.User.objects.filter(pk=1, name='gavin').first()  
# 不存在返回None 可以写多个条件,并且默认为and关系

res=models.User.objects.filter().filter().filter()
# 只要是QuerySet对象,就可以一直点,链式操作

res = models.User.objects.filter().last()  
#  结果集中最后一个对象

res = models.User.objects.all().values('name')  
# QuerySet对象  列表套字典 指定字段,all可以不用写

res = models.User.objects.all().values_list('name')  # 结果列表套元组 获取对象的name

res = models.User.objects.all().distinct()  
# 去重操作distinct(), 数据如果包含主键,不能去重

res = models.User.objects.values('name').distinct()
# 因为去重要求数据全部一模一样,所以用名字来去重

res = models.User.objects.order_by('age')  
# 通过年龄排序,默认升序order_by

res = models.User.objects.order_by('-age')  
# 可以改为降序

res = models.User.objects.order_by('age','pk')  
# 支持多个字段

res = models.User.objects.exclude(name='gavin')  
# 取反操作exclude

res = models.User.objects.reverse()  
# reverse 不起作用,只能在order_by 排序之后使用

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

res = models.User.objects.get(pk=1)  
# 直接获取对象 

res = models.User.objects.get(pk=120)  # 对象不存在则报错 so不推荐使用,直接filter

OhtRbt.jpg

标签:自定义,models,res,ORM,filter,objects,User,模板
来源: https://www.cnblogs.com/lsw8898/p/16279077.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有