python之路49 模板层标签 自定义过滤器 模板继承、模型层准备、ORM部分操作
模板层之标签
{% if 条件1(可以自己写也可以是用传递过来的数据) %}
        <p>周三了 周三了</p>
{% elif 条件2(可以自己写也可以用传递过来的数据) %}
        <p>百日冲刺</p>
{% else %}
        <p>快要放假了</p>
{% endif %}
{% 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 %}
django模板语法取值操作>>>:只支持距句点符
    句点符既可以点索引也可以点键
    {{d1.hobby.2.a1}}
 <p>
{% with  d1.hobby.2.a1  as h %} 复杂数据获取之后需要反复使用可以起别名
     <a href="">{{ h }}</a>
{% endwith %} </p>
forloop

自定义过滤器、标签及、inclusion_tag(了解)
"""
如果想要自定义一些模板语法 需要先完成下列的三步走战略
    1.在应用下创建一个名字必须叫templatetags的目录
    2.在上述目录下创建任意名称的py文件
    3.在上述py文件内先编写两行固定的代码
         from django import template
         register = template.Library()
"""
# 自定义过滤器(最大只能接收两个参数)
@register.filter(name='myadd')
def func1(a, b):
    return a + b
{% load mytags %}
<p>{{ a|myadd:1 }}</p>
这是定义过滤器过程中的一个报错




# 自定义标签(参数没有限制)
@register.simple_tag(name='mytag')
def func2(a,b,c,d,e):
    return f'{a}-{b}-{c}-{d}-{e}'
{% load mytags %}
{% mytag 'jason' 'kevin' 'oscar' 'tony' 'lili' %}
# 自定义inclusion_tag(局部的html代码)
@register.inclusion_tag('menu.html',name='mymenu')
def func3(n):
    html = []
    for i in range(n):
        html.append('<li>第%s页</li>'% i)
    return locals()
menu.html局部页面代码
<ul>
    {% for liStr in html %}
        {{ liStr|safe }}
    {% endfor %}
</ul>
{% load mytags %}
{% mymenu 10 %}
模板的继承与导入
模板的继承(重要)
  多个页面有很多相似的地方 我们可以采取下列方式
方式1:传统的复制粘贴
方式2:模板的继承
1.在模板中使用block划定字板以后可以修改的区域
   {% block 区域名称 %}
   {% endblock %}
2.子板继承模板
    {% extends 'home.html' %}
    {% block 区域名称 %}
       子板自己的内容
    {% endblock %}
ps:模板中至少应该有三个区域
   页面内容区、css样式区、js代码区
补充:子板也可以继续使用模板的内容
    {{ block.super}}
模板的导入(了解)
    将某个html的部分提前写好  之后很多html页面都想使用就可以导入
      {% include 'myform.html' %}
模型层之前期准备
1.自带的sqlite3数据库对日期字段不敏感 有时候会展示错乱所以我们习惯切换成常见的数据库比如MySQL django orm并不会自动帮你创建库 所以需要提前准备好
2.单独测试django某个功能层
    默认不允许单独测试某个py文件 如果想要测试某个py文件(主要models.py)
       测试环境1:pycharm提供的python console
       测试环境2:自己搭建(自带的test或者自己创建)
        1.拷贝manage.py前四行
        2.自己再加两行
         import django
         django.setup()
3.django orm底层还是SQL语句 我们是可以查看的
    如果我们手上是一个QuerySet对象 那么可以直接点query查看SQL语句
    如果想查看所有orm底层的SQL语句也可以在配置文件添加日志记录
搭建测试环境时需要配合数据库进行,在进行数据库迁移命令操作时,我把django自带的makemigrations文件夹删除了然后只要执行makemigrations报错

执行migrate报错

# 不要删除django自带的文件夹!!!!!
ORM常用关键字
models.py 代码
from django.db import models
# Create your models here.
class User(models.Model):
    name = models.CharField(max_length=32, verbose_name='用户名')
    age = models.IntegerField(verbose_name='年龄')
    register_time = models.DateTimeField(verbose_name='注册时间', auto_now_add=True)
    '''
    针对时间字段有两个重要的参数
        auto_now : 每次操作数据都会自动更新当前时间
        auto_now_add:创建数据自动获取当前时间  后续修改不人为操作的情况下不会更新
    '''
    def __str__(self):
        return f'用户对象{self.name}'
tests.py代码
import os
def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoday05.settings')
    import django
    django.setup()
    from app01 import models
    # print(models.User.objects.filter())
    # 1.create() 创建数据并直接获取当前创建的数据对象
    # res = models.User.objects.create(name='tony', age=21)
    # res = models.User.objects.create(name='kevin', age=19)
    # res = models.User.objects.create(name='kkkk', age=22)
    # res = models.User.objects.create(name='llll', age=25)
    # res = models.User.objects.create(name='mmmm', age=17)
    # print(res)
    # 2.filter()  根据条件筛选数据  <QuerySet [<User: 用户对象jsaon>, <User: 用户对象tony>, <User: 用户对象kevin>, <User: 用户对象kkkk>, <User: 用户对象llll>, <User: 用户对象mmmm>]>
    # res = models.User.objects.filter()
    # res = models.User.objects.filter(name='jsaon') #  <QuerySet [<User: 用户对象jsaon>]>
    # res = models.User.objects.filter(name='jsaon',age=19)
    # 3. first() last() QuerySet支持索引取值但是只支持正数 并且orm不建议你使用索引
    # res = models.User.objects.filter()[1]
    # res = models.User.objects.filter(pk=100)[0]  # 数据不存在索引取值会报错
    # res = models.User.objects.filter(pk=100).first() # 数据不存在不会报错而是返回None
    # res = models.User.objects.filter(pk=100).last() # 数据不存在不会报错而是返回None
    # 4.update() 更新数据(批量更新)
    # models.User.objects.filter().update()   # 批量更新
    # models.User.objects.filter(id=1).update()   # 单个更新
    # 5.delete() 删除数据(批量删除)
    # models.User.objects.filter().delete() # 批量删除
    # models.User.objects.filter(id=1).delete() # 单个删除
    # 6.all() 查询所有数据  结果是QuerySet[数据对象1,数据对象2]
    # res = models.User.objects.all()
    # 7.values() 根据指定字段获取数据  结果是 QuerySet [{},{},{},{}]
    # res = models.User.objects.all().values('name')
    # res = models.User.objects.filter().values()
    # res = models.User.objects.values()
    #  8.values_list()  根据指定字段获取数据 结果是QuerySet [(),(),(),()]
    # res = models.User.objects.all().values_list('name','age')
    # 9.distinct() 去重 数据一定要一模一样才可以 如果有主键肯定不行
    # res = models.User.objects.values('name','age').distinct()
    # 10.order_by() 根据指定条件排序 默认是升序 字段前面加负号就是降序
    # res = models.User.objects.all().order_by('age')
    # 11. get()  根据条件筛选数据并直接获取到数据对象 一旦条件不存在会直接报错 不建议使用
    # res = models.User.objects.get(pk=1)
    # res = models.User.objects.get(pk=100,name='mmmm')
    # 12.exclude()   取反操作
    # res = models.User.objects.exclude(pk=11)
    # 13.reverse()  颠倒顺序(被操作的对象必须是已经排序的才可以)
    # res = models.User.objects.all().order_by('age')   # <QuerySet [<User: 用户对象mmmm>, <User: 用户对象kevin>, <User: 用户对象tony>, <User: 用户对象kkkk>, <User: 用户对象llll>]>
    # res1 = models.User.objects.all().order_by('age').reverse() # <QuerySet [<User: 用户对象llll>, <User: 用户对象kkkk>, <User: 用户对象tony>, <User: 用户对象kevin>, <User: 用户对象mmmm>]>
    # 14 coint()  统计结果集中数据的个数
    # res = models.User.objects.all().count()  # 5
    # 15.exists()  判断结果集中是否含有数据 如果有则返回 True  没有则返回False
    res = models.User.objects.all().exists()  # True
    res1 = models.User.objects.filter(pk=100).exists()   # False
    print(res)
    print(res1)
main()
												
											python之路49 模板层标签 自定义过滤器 模板继承、模型层准备、ORM部分操作的更多相关文章
- Django 笔记(四)模板标签 ~ 自定义过滤器
		
模板标签: 标签在渲染的过程中提供任意的逻辑 语法: 由{% ... %} 和 {% end... %} 常用标签: with:类似取别名 模版继承: Django模版引擎中最强大也是最复杂的部分就是 ...
 - Python - Django - 模板语言之自定义过滤器
		
自定义过滤器的文件: 在 app01 下新建一个 templatetags 的文件夹,然后创建 myfilter.py 文件 这个 templatetags 名字是固定的,myfilter 是自己起的 ...
 - Django - 环境搭建、url、视图、模板、标签、过滤器
		
(一).简介 简介就不多说了,网上的内容一大堆.总结来说,django是走大而全的路线,写项目超级快,几乎什么都为你考虑到了,你就乖乖照着它的格式来写就行了. 这里来一些基本认知: web应用框架(w ...
 - django模板中的自定义过滤器
		
(1)在APP下创建templatetags文件夹,与Models.py.views.py等同级,templatetags文件夹下添加__init__.py文件,可为空,再添加一个模块文件,例如cpt ...
 - Python之路-(js正则表达式、前端页面的模板套用、Django基础)
		
js正则表达式 前端页面的模板套用 Django基础 js正则表达式: 1.定义正则表达式 /.../ 用于定义正则表达式 /.../g 表示全局匹配 /.../i 表示不区分大小写 /.../m ...
 - django系列4.2--自定义标签, 自定义过滤器, inclusion_tag, 引入静态文件(css,js等)
		
项目的目录为 在app中创建templates时,最好要再创建一个app名相同的文件夹,因为项目找文件时从第一个app开始遍历,不同app内的同名文件会有冲突,所以这样处理 一.自定义标签和过滤器 1 ...
 - 解决 idea template jsp模板中使用自定义路径 模板不显示问题
		
${} 是一个模板中的关键字,所以建立时需要用 \ 注释即可正常显示 ${APP_PATH}
 - Web框架之Django_04 模板层了解(过滤器、标签、自定义过滤器、标签、inclusion_tag、模板的继承与导入)
		
摘要: 模版层(模板语法) 模板语法 过滤器 标签 自定义过滤器.标签 inclusion_tag 模板的继承 模板的导入 一.模板语法: 常用语法:{{ }} 变量相关{% %} ...
 - Django 模型层(标签、过滤器、模板的继承与导入)
		
过滤器/自定义过滤器 模板语法中的过滤器类似于python中的内置方法,在我们把数据从后端通过rander传入到前端html文件中之后,在前端我们可以通过模板语法,对传入的数据再进行以通骚操作. 首先 ...
 - Django 你需要掌握的模型层(标签、过滤器、模板的继承与导入)
		
Django 模型层(标签.过滤器.模板的继承与导入) 好文章来自超哥:https://www.cnblogs.com/guanchao/p/11006062.html 过滤器/自定义过滤器 模板 ...
 
随机推荐
- HTML+CSS基础知识(4)简单的广告界面
			
文章目录 1.网页实例 1.1 代码 1.2 测试效果 1.网页实例 1.1 代码 css样式 /* 清除页面样式 */ *{ margin:0; padding: 0; } /* 统一页面的样式 * ...
 - python实现多接口翻译软件
			
本实验用pyqt5做了一个小软件,里面使用了市面上主流的6种翻译软件接口:谷歌.百度.有道.金山词霸.腾讯.必应,界面如图所示: 以下是程序代码: import time,sys,os,hashlib ...
 - java程序员在交接别人的工作时如何保证顺利交接?
			
序言 各位好啊,我是会编程的蜗牛,作为java开发者,尤其是在职场混迹了多年的老手,肯定会遇到同事离职的情况,或者自己跳槽的情况,这些都免不了需要做好交接工作,不管是别人交接给我们,还是我们交接给别人 ...
 - Sentinel 介绍与下载使用
			
sentinel 前方参考 计算QPS-Sentinel限流算法 https://www.cnblogs.com/yizhiamumu/p/16819497.html Sentinel 介绍与下载使用 ...
 - LabVantage仪器数据采集方案
			
LabVantage的仪器数据采集组件为LIMS CI,是一个独立的应用程序/服务,实现仪器数据的采集(GC.LC等带有工作站的仪器). 将仪器输出数据转换为LIMS所需数据并传输,使用Talend这 ...
 - Codeforces Global Round 23 A-D
			
比赛链接 A 题解 知识点:贪心,构造. 注意到有 \(1\) 就一定能构造. 时间复杂度 \(O(n)\) 空间复杂度 \(O(1)\) 代码 #include <bits/stdc++.h& ...
 - 基于FPGA的AES加解密IP
			
Programmable AES Encryption/ Decryption IP 可编程AES加解密IP 可编程AES加解密IP提供了加解密算法功能,兼容美国国家标准与技术研究院(NIST)发布的 ...
 - Java Timer使用介绍
			
java.util包下提供了对定时任务的支持,涉及2个类: Timer:定时器类 TimerTask:任务抽象类 使用该定时任务我们需要继承TimerTask抽象类,覆盖run方法编写任务执行代码,并 ...
 - JS 学习笔记 (七) 面向对象编程OOP
			
1.前言 创建对象有很多种方法,最常见的是字面量创建和new Object()创建.但是在需要创建多个相同结构的对象时,这两种方法就不太方便了. 如:创建多个学生信息的对象 let tom = { n ...
 - 深入学习SpringBoot
			
1. 快速上手SpringBoot 1.1 SpringBoot入门程序开发 SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程 1. ...