计算机基础知识53

模板之变量

所有的数据类型都可以在模板中使用

render(request , 'index.html',context = {' '});

render(request , 'index.html',context = locals());

在模板中使用变量的时候,使用的是字典的key值,key值和value值保持一致

模板之过滤器

# HTML被直接硬编码在 Python代码之中,Django的 模板系统(Template System)

# 过滤器给我们提供的有六十多个,但是我们只需要掌握10个以内即可
         过滤器名称就是函数名

# 语法:
{{ obj|filter__name:param }}     变量名字|过滤器名称:变量

default:如果一个变量是false或者为空,使用给定的默认值,否则使用变量的值

length:返回值的长度,对字符串和列表都起作用

filesizeformat:将值格式化为一个 “人类可读的” 文件尺寸   #  '13 KB', '4.1 MB'

date:日期格式

slice:切片

truncatechars:如果字符串字符多于指定的字符数量,那么会被截断,省略号序列(“…”)结尾

safe:告诉Django这段代码是安全的不必转义

# views.py
from django.shortcuts import render

# Create your views here.
def index(request):
    a = False
    l = [1,2,3,4,5]
    size = 43434343434342
    import datetime
    ctime = datetime.datetime.now()
    value = 'helloworld'

    from django.utils.safestring import mark_safe
    # 有很多时候前端的代码也可以在后端处理
    s1 = mark_safe('

hello

') return render(request,'index.html',locals())
# index.html



    
    Title
    
    
    


{{ a|default:'hello' }}
{{ l|length }}
{{ size| filesizeformat}}
{{ ctime| date:"Y-m-d"}}
{{ value| slice:'2:-1'}}
{{ s1|safe }}

计算机基础知识53_第1张图片

# 其它过滤器(了解)

upper	  以大写方式输出
add	      给value加上一个数值
addslashes	单引号加上转义号
capfirst	第一个字母大写
center	    输出指定长度的字符串,把变量居中
cut	        删除指定字符串
date	    格式化日期
default	    如果值不存在,则使用默认值代替
default_if_none	     如果值为None, 则使用默认值代替
dictsort	         按某字段排序,变量必须是一个dictionary
dictsortreversed	 按某字段倒序排序,变量必须是dictionary
divisibleby	         判断是否可以被数字整除
escape	             按HTML转义,比如将”<”转换为”<”
filesizeformat	增加数字的可读性,转换结果为13KB,89MB,3Bytes等
first	        返回列表的第1个元素,变量必须是一个列表
floatformat	    转换为指定精度的小数,默认保留1位小数
get_digit	    从个位数开始截取指定位置的数字
join	        用指定分隔符连接列表
length	        返回列表中元素的个数或字符串长度
length_is	检查列表,字符串长度是否符合指定的值
linebreaks	用/或/标签包裹变量
linebreaksbr	用/标签代替换行符
linenumbers	    为变量中的每一行加上行号
ljust	        输出指定长度的字符串,变量左对齐
lower	        字符串变小写
make_list	将字符串转换为列表
pluralize	根据数字确定是否输出英文复数符号
random	    返回列表的随机一项
removetags	删除字符串中指定的HTML标记
rjust	    输出指定长度的字符串,变量右对齐
slice	    切片操作, 返回列表
slugify	    在字符串中留下减号和下划线,其它符号删除,空格用减号替换
stringformat	字符串格式化,语法同python
time	        返回日期的时间部分
timesince	以“到现在为止过了多长时间”显示时间变量
timeuntil	以“从现在开始到时间变量”还有多长时间显示时间变量
title	    每个单词首字母大写
truncatewords	       将字符串转换为省略表达方式
truncatewords_html	   同上,但保留其中的HTML标签
urlencode	           将字符串中的特殊字符转换为url兼容表达方式
urlize	               将变量字符串中的url由纯文本变为链接
wordcount	           返回变量字符串中的单词数

模板之for标签

# 标签看起来像是这样的: {% tag %}
# 标签比变量更加复杂:一些在输出中创建文本,一些通过循环或逻辑来控制流程,一些加     载其后的变量将使用到的额外信息到模版中。
# 一些标签需要开始和结束标签 (例如{% tag %} ...标签 内容 ... {% endtag %})

for标签

{% for person in person_list %}
    

{{ person.name }}

{% endfor %} #可以利用{% for obj in list reversed %}反向完成循环。

遍历一个字典:

{% for key,val in dic.items %}
    

{{ key }}:{{ val }}

{% endfor %} {% for foo in d.keys %}

{{ foo }}

{% endfor %} {% for foo in d.values %}

{{ foo }}

{% endfor %} {% for foo in d.items %}

{{ foo }}

{% endfor %}

注:循环序号可以通过{{forloop}}显示

        forloop.counter           序号
        forloop.counter0         索引值
        forloop.revcounter        当前循环的倒序索引值(从1开始)
        forloop.revcounter0      当前循环的倒序索引值(从0开始)
        forloop.first            当前循环是不是第一次循环(T/F)
        forloop.last             当前循环是不是最后一次循环(T/F)
        forloop.parentloop        本层循环的外层循环

for … empty:以便在给出的组是空的或者没有被找到时,可以有所操作。

{% for person in person_list %}
    

{{ person.name }}

{% empty %}

sorry,no person here

{% endfor %}

模板之if标签和with

if标签

#  {% if %}会对一个变量求值,如果它的值是True(存在、不为空、且不是boolean类型的false值)对应的内容块会输出

#  if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断

{% if num > 100 or num < 0 %}
    

无效

{% elif num > 80 and num < 100 %}

优秀

{% else %}

凑活吧

{% endif %}

with标签:起别名

#  使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的

d = {'username':'kevin','age':18,'info':'这个人有点意思','hobby':[111,222,333,{'info':'NB'}]}

# with起别名
{% with d.hobby.3.info as nb  %}
    

{{ nb }}

在with语法内就可以通过as后面的别名快速的使用到前面非常复杂获取数据的方式

{{ d.hobby.3.info }}

{% endwith %} {% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %} 不要写成as

# 自定义的标签和过滤器:

        1、在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的                       simple_tag.

        2、在app中创建templatetags模块(模块名只能是templatetags

        3、创建任意 .py 文件,如:my_tags.py

from django import template
from django.utils.safestring import mark_safe
 
register = template.Library()   #register的名字是固定的,不可改变
 
@register.filter
def filter_multi(v1,v2):
    return  v1 * v2
    
@register.simple_tag
def simple_tag_multi(v1,v2):
    return  v1 * v2
    
@register.simple_tag
def my_input(id,arg):
    result = "" %(id,arg,)
    return mark_safe(result)

模板的继承和导入

# 模块之继承:          

{% entends 'home.heml' %}
head:
{% block css %}
    
{% endblock %}

# 一定要在被继承的页面中划分区域,你需要在哪个地方划分哪一块,可以划分多个区域,

{% block css %}
    
{% endblock %}


{% block js %}
    
{% endblock %}

{% include 'haha.html' %}

#  导入语法:{% include '模版名称' %}  如:{% include 'adv.html' %}

模型层的表查询:跟数据库打交道的

1、单表查询:

        insert update delete all filter

2、常见的查询方法:

单表操作:     
    1、all()      查询所有数据,索引取值    
    2、filter()   过滤条件查询     
    3、get()      查询数据,查询数据为空的情况直接报错     
    4、last()     取所有数据的最后一条     
    5、values( id,username,password )   取值,列表套字典[{'id':1,'username':...},{...}]     
    6、vallues_list()                   取值,列表套元组,都支持for循环     
    7、pring(res.quert)   查看内部的SQL语句,只有防御的结果是queryset对象的时候才能查看     
    8、distinct()         去重     
    9、order_by( 'id' )   默认情况升序排序;('-id')倒序     
    10、reverse()         翻转     
    11、count()           统计当前表中数据的个数     
    12、exclude(pk=1)     排除在外     
    13、exists()          看数据到底有没有

计算机基础知识53_第2张图片

3、基于双下划线的查询:

res = models.UserInfo.object.filter(age_gt=38).all()
age__gt=1---大于
age__lt=1---小于
age__gte=1---大于等于
age__lte=1---小于等于
ageage__in=[18,40]  年龄在十八或40的,或
age__range=[18,40]  年龄在十八到40的,之间

 # 包含s的数据,模糊查询:   

包含s的数据,模糊查询:
    # select * from userinfor where name like '%s%',
    res = models.UserInfo.object.filter(username__contains='s').all()
    print(res)
    print(res.query)
username__icontains--忽略大小写
username__startswith=='o'--以o开头的
username__endswith=='o'--以o结尾的

# 日期查询:

register_time = models.DateTimeField(auto_now=True,auto_now_add=True,null=True)
auto_now: 修改的时间
auto_now_add: 刚加进去时间
查询时间:查2020年1月份的
filter(register_time__year='2020',register_time__month='01).all()

双下划线的查询案例

1 年龄大于35岁的数据
    res = models.User.objects.filter(age__gt=35)
2 年龄小于35岁的数据
    res = models.User.objects.filter(age__lt=35)
3、大于等于 小于等于
    res = models.User.objects.filter(age__gte=32)
    res = models.User.objects.filter(age__lte=32)

4、年龄是18 或者 32 或者40
    res = models.User.objects.filter(age__in=[18,32,40])

5、年龄在18到40岁之间的  首尾都要
    res = models.User.objects.filter(age__range=[18,40])

6、查询出名字里面含有s的数据  模糊查询
    res = models.User.objects.filter(name__contains='s')
7、是否区分大小写  查询出名字里面含有p的数据  区分大小写
    res = models.User.objects.filter(name__contains='p')
8、忽略大小写
    res = models.User.objects.filter(name__icontains='p')

    res = models.User.objects.filter(name__startswith='j')
    res1 = models.User.objects.filter(name__endswith='j')

9、查询出注册时间是 2020 1月
    res = models.User.objects.filter(register_time__month='1')
    res = models.User.objects.filter(register_time__year='2020')

测试脚本

# 当你只是想测试django中的某一个py文件内容 那么你可以不用书写前后端交互的形式
   而是直接写一个测试脚本即可

# 脚本代码无论是写在应用下的tests.py还是自己单独开设py文件都可以
# 测试环境的准备 去manage.py中拷贝前四行代码 然后自己写两行

import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day64.settings")
    import django
    django.setup()

计算机基础知识53_第3张图片

# 在这个代码块的下面就可以测试django里面的单个py文件了

查看内部sql语句的方式

方式1:queryset对象才能够点击query查看内部的sql语句

res = models.User.objects.values_list('name','age')  
# 
print(res.query)

方式2:所有的sql语句都能查看

# uptade等等没有queryset对象的只需设置配置文件setting

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

今日思维导图:

你可能感兴趣的:(python,django,数据库)