django之模型层

1. 模板语法之过滤器

复制代码
"""
使用的时候可以看看源码
"""
1.语法结构
    {{ 数据对象|过滤器名称:参数 }}  过滤器最多只能额外传输一个参数
2.常见过滤器(django模板语法提供了60+过滤器 我们了解几个即可)
    <p>统计数据的长度:{{ s1|length }}</p>
    <p>判断当前数据对象对应的布尔值是否是False:{{ s2|default:'jason 18' }}</p>
    <p>将数字转成合适的文件计量单位:{{ s3|filesizeformat }}</p>
    <p>算术加法或者字符串加法:{{ s3|add:111 }}、{{ s4|add:'big baby' }}</p>
    <p>时间格式化:{{ s5|date:'Y-m-d' }}</p>
    <p>索引切片:{{ s6|slice:'3:13' }}</p>
    <p>按照空格截取指定个数的文本:{{ s6|truncatewords:3 }}</p>
    <p>按照字符个数截取文本(包含三个点):{{ s6|truncatechars:10 }}</p>
    <p>移除指定的字符:{{ s6|cut:' ' }}</p>
    <p>是否取消转换:{{ tag1 }}、{{ tag1|safe }}、{{ scripts1|safe }}、{{ res }}</p>
      
ps:最后一个|safe启发了我们以后用django开发全栈项目前端页面代码(主要指HTML代码)也可以在后端编写
复制代码

 

 

2. 模板语法之标签

复制代码
"""
在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 %}
  """
  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 %}
  """
ps:针对字典同样提供了keys、values、items方法
复制代码

代码示例

复制代码
{% if i < 10 %}
    <h1>i小于10</h1>
{% elif i < 50 %}
    <h1>i小于50</h1>
{% else %}
    <h1>i大于50</h1>
{% endif %}
<ul>
    {% for index in index_list %}
        <li><h1>{{ index }}  {{ forloop }}</h1></li>
    {% endfor %}
    {% for empty in empty_list %}
    {% empty %}
        <h1>{{ empty }}</h1>
        <h1>循环数据为空</h1>
    {% endfor %}
</ul>
复制代码

 

 

3. 自定义过滤器、标签、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
{% 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
@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页面 之后将渲染的结果放到调用的位置'''
复制代码

 

 

4. 模板的导入

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

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

 

 

5. 注释语法补充

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

 

 

6. 模板的继承

复制代码
类似于面向对象的继承:继承了某个页面就可以使用该页面上所有的资源
  
有很多网站的很多页面 其实都是差不多的 只是局部有所变化 模板的继承可以很好的实现该需求

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

 

 

 7. 前期数据准备

复制代码
"""
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", "djangoProject1.settings")
    import django

    django.setup()
    from app01 import models
    2.pycharm提供
        python console
复制代码

 

 

 

 8. orm操作

复制代码
models.User.objects.all(): 查询所有结果

models.User.objects.filter(**kwargs): 它包含了与所给筛选条件相匹配的对象

models.User.objects.get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。

models.User.objects.exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象

models.User.objects.values(*field): 返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列

models.User.objects.values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

models.User.objects.order_by(*field): 对查询结果排序

models.User.objects.order_by().reverse(): 对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)

models.User.objects.distinct(): 从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重)

models.User.objects.count(): 返回数据库中匹配查询(QuerySet)的对象数量。

models.User.objects.first(): 返回第一条记录

models.User.objects.last(): 返回最后一条记录

models.User.objects.exists(): 如果QuerySet包含数据,就返回True,否则返回False
复制代码

 

posted @   thrombus  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示