ICode9

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

django基础(五)

2022-05-17 00:31:08  阅读:148  来源: 互联网

标签:name models res 基础 django filter objects User


django基础(五)

模板语法

1.过滤器(类似于内置函数)

2.标签(类似于流程控制)

自定义过滤器、标签、inclusion_tag

模块的导入

注释语法补充

模板的继承

搭建数据环境

orm关键字使用

模板语法之过滤器

1.语法结构:
{{数据对象|过滤器名称:参数}}	过滤器最多只能额外传输一个参数
2.常见过滤器
def index(request):
    s1 = 'hello wh 加油'
    s2 = '今 天 天 气 真 好'
    n1 = 666
    file_size = 1024(数字越大它会自动转换单位)
    b2 = False
    from datetime import datetime
    ctime = datetime.today()
    info = 'wh|123|read'
    tag1 = '<h1>我是一个标题标签</h1>'
    from django.utils.safestring import mark_safe
    ttt = '<a href="https://www.baidu.com">点我</a>'
    res = mark_safe(ttt)
    return render(request,'index.html',locals())
    
    <p>统计数据的长度:{{ s1|length }}</p>		
    # 统计数据的长度11
    <p>算术加法或者字符串加法:{{ n1|add:111 }}、{{ s1|add:'big baby' }}</p>
    #    算术加法或者字符串拼接777、hello wh 加油big bybe
    <p>将数字转成合适的文件计量单位:{{ file_size|filesizeformat }}、{{ file_size1|filesizeformat }}</p>
        # 1.0 KB
    <p>判断当前数据对象对应的布尔值是否是False:{{ b|default:'前面的值对应的布尔值是False' }}、{{ s1|default:'前面的值对应的布尔值是False' }}</p>
   #  前面的值对应的布尔值是False 、hello wh 加油
    <p>时间格式化:{{ ctime|date:'Y-m-d H:i:s' }}</p>
    # 2022-05-16 17:35:04    
    <p>索引切片:{{ s1|slice:'0:8' }}</p>
        # hello wh
    <p>按照空格截取指定个数的文本:{{ s2|truncatewords:2 }}</p>
        # 今 天 ...
    <p>按照字符个数截取文本(包含三个点):{{ s2|truncatechars:4 }}</p>
        # 今...
    <p>移除指定的字符:{{ info|cut:'|' }}</p>
        # wh123read
    <p>是否取消转换:{{ tag1 }}、{{ tag1|safe }}、{{ scripts1|safe }}、{{ res }}</p>
      # <h1>我是一个标题标签</h1>、safe取消转换、
    # scripts可以默认全部是安全标签,但是很多时候会造成死循环
    
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关键字
  	{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}
  {% for i in l1 %}
    <p>{{ i }}</p>
	{% endfor %}
  """
 4. for+if其他使用
  {% for i in l1 %}
    {% if forloop.first %}
        <p>这是第一次循环</p>
    {% elif forloop.last %}
        <p>这是最后一次循环</p>
    {% else %}
        <p>中间循环</p>
    {% endif %}
    {% empty %}
        <p>for循环对象为空 自动执行empty</p>
  {% endfor %}
  """
ps:针对字典for循环取值
    {% for foo in dict %}
    {{foo}}
    {% endfor %}
    # 默认拿到的是字典的键,想要获取值的话,直接在字典后面.keys(获取的是K值),.values(获取的是V值);.items(获取的是整个字典的键值对)
    

自定义过滤器、标签、inclusio_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
{% load mytag %}	# 要先加载
{{ n1|index:666 }}

# 自定义简单标签:可以接收任意的参数
@register.simple_tag(name='my_tag')
def func1(a, b, c, d):
    return a + b + c + d
{% my_tag 1 2 3 4 %}  # 参数之间空格隔开即可

# 自定义inclusion_tag(工作原理是先调用一个inclusion_tag,它会触发一个函数,这个函数会作用到一个html页面上,然后把这个页面的结果放回去开始的地方,所以还要在创一个html文件夹)
@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>登录内容</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
"""
需求
	我们只想操作orm 不想使用网络请求
  	需要有专门的测试环境
    1.自己搭建
    	import os
			if __name__ == "__main__":
    			os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.settings")
    			import django
    			django.setup()
                from app01 import models	# 操作django单独的某个py文件操作,一定要将这句代码写在下面,不能写在上面,如果这个文件不属于整个业务逻辑的文件的话,而是一个普普通通的测试文件的话,一定要搭一个这样的环境)
    2.pycharm提供
    	python console
  		然后再输入 from app01 import models
        models.User.objects.filter()

orm操作关键字

     models.User.objects.create(name='jason',age=18)
     models.User.objects.create(name='tony',age=28)
     models.User.objects.create(name='kevin',age=28)
     models.User.objects.create(name='kerry',age=38)
     models.User.objects.create(name='jack',age=38)
     models.User.objects.create(name='tom',age=28)
     models.User.objects.create(name='oscar',age=18)

    # 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 可以看成是列表套元组

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

    # 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.exclude(name='jason')  # 取反操作

    # 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='jasonNB').exists()  # 判断结果集中是否有数据 有返回True 没有返回False

    # res = models.User.objects.get(pk=1)  # 直接获取数据对象 但是不推荐使用
    # res = models.User.objects.get(pk=100)  # 条件不存在 直接报错
    res = models.User.objects.filter(pk=100)  # 条件不存在 返回空
    print(res)


标签:name,models,res,基础,django,filter,objects,User
来源: https://www.cnblogs.com/WH101/p/16279247.html

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

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

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

ICode9版权所有