FRI.模板语法及 ORM 常见操作

FRI.模板语法及 ORM 常见操作

模板语法 – 传值

def index(request):

    a = 123
    b = 11.11
    c = 'abcdefg'
    d = True
    e = [1, 2, 3,4 ]
    f = (5, 6, 7)
    g = {8, 9 ,10}
    h = {'name': 'egon', 'age': 18, 'k1':[1, {"hobby":'football'}]}
    # 模板中使用函数,不要加括号
    def index():
        print("index")
        return 123

    class Student():
        def test(self):
            print('test')
            return "test"
    print(locals())
    return render(request, 'index.html', locals())

index.html
{{ a }}
{{ b }}
{{ c }}
{{ d }}
{{ e }}
{{ f }}
{{ g }}
{{ h }}
{{ index }}
{{ Student }}
{{ Student.test }}

模板中取值,要用点语法
{{ e.1 }}
{{ h.name }}
{{ h.k1.1.hobby }}

模板语法 – 过滤器

# 语法
{{|过滤器方法:参数 }}

date,safe必须掌握住
{{ ctime|date:'Y-m-d H:i:s' }}
{{ filesize|filesizeformat }}

s = '<h1>hello world</h1>'  
{{ s|safe}} 相当于 Python中 s1 = mark_safe(s)


'XSS 攻击'

def xss(request):
    s = '''
    <script>
    for (let i=0; i<10000000000; i++){
        alert('XSS')
    }
    </script>
    '''
    return render(request, 'data.html', locals())
  
{{ s|safe }}

模板语法之标签
{% for foo in l %}
    {{ forloop }}
  """
  {'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 5, 'revcounter0': 4, 'first': True, 'last': False}

	{'parentloop': {}, 'counter0': 1, 'counter': 2, 'revcounter': 4, 'revcounter0': 3, 'first': False, 'last': False}

	{'parentloop': {}, 'counter0': 2, 'counter': 3, 'revcounter': 3, 'revcounter0': 2, 'first': False, 'last': False}

	{'parentloop': {}, 'counter0': 3, 'counter': 4, 'revcounter': 2, 'revcounter0': 1, 'first': False, 'last': False}

	{'parentloop': {}, 'counter0': 4, 'counter': 5, 'revcounter': 1, 'revcounter0': 0, 'first': False, 'last': True}
  
  counter0 -- 索引
  counter -- 正序
  revcounter -- 倒序
  revcounter0 -- 倒序索引
  first -- 第一个则为 True
  last -- 最后一个则为 True
  """
    <p>
        {{ foo }}
    </p>
{% endfor %}


{% for foo in l %}
    {% if forloop.first %}
        <p>
            第一次
        </p>
    {% elif forloop.last %}
        <p>
            最后一次
        </p>
    {% else %}
        <p>
            {{ foo }}
        </p>
    {% endif %}
{% endfor %}

{% for foo in d.keys %}
    <p>
        {{ foo }}
    </p>
{% endfor %}

{% for foo in d.values %}
    <p>
        {{ foo }}
    </p>
{% endfor %}

{% for foo in d.items %}
    <p>
        {{ foo }}
    </p>
{% endfor %}
模板语法之继承
# 导入模板
{% include 'left.html' %}

# 模板继承
{% extends 'home.html' %}

{% block css %}
    <style>
        h1 {
            color: red;
        }
    </style>
{% endblock %}

{% block js %}
    <script>
        alert(123)
    </script>
{% endblock %}

{% block content %}
    <h1>登录页面</h1>
    <form action="">
        <p>username: <input type="text" class="form-control"></p>
        <p>password: <input type="text" class="form-control"></p>
        <input type="submit" class="btn btn-success btn-block">
    </form>

    {% include 'left.html' %}


{% endblock %}
ORM单表操作
  • Django 自带的 SQLite3 数据库对日期格式不是很敏感,处理的时候容易出错,将数据库切换为 MySQL 即可
# 增
models.User.objects.create(name='egon', age=18, create_time='2021-08-13')

# 第二种方式
user_obj = models.User(name='egon1',age=19,create_time='2021-08-14')
user_obj.save()

    
# 改 pk => primary key => 主键
# pk 会自动查找当前标的主键字段,指代的就是当前的主键字段,用了 pk 之后,就不需要直到当前表的主键字段名称了
 models.User.objects.filter(pk=1).update(name='EGON')

# 第二种方式
user_obj = models.User(name='egon')
user_obj.save()

# 删
res = models.User.objects.filter(pk=1).delete()  # (1,{'app01.User': 1})  1 表示当前 SQL 语句影响的行数

# 第二种方式
user_obj = models.User.objects.filter(pk=1).first()
user_obj.delete()

# 查
models.User.objects.filter()
models.User.objects.all()
res = models.User.objects.filter(pk=1).first()
res = models.User.objects.filter().last()
res = models.User.objects.filter(pk=10).get()  # 若数据不存在会直接报错

"""
DateField      年月日
DateTimeField  年月日时分秒
*****************************************************************************************************
auto_now       每次操作数据的时候,该字段会自动将当前时间更新
auto_now_add   在创建数据的时候会自动将当前创建时间记录下来,之后只要不认为修改,那么就一直不变(主用,多用于注册时间)
*****************************************************************************************************


"""
测试环境的搭建
"""
用于测试 Django 中的某一个 py 文件内容,就可以做到不书写前后端交互的形式,而是直接写一个测试脚本
"""

# 测试环境的搭建 -- 去 manage.py 中拷贝前四行代码,并补充 'imoprt django', 'django setup()'
import os
import sys
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.settings")
    # 所有代码必须等待测试环境搭建完毕
    import django
    django.setup()
    
    
    
'''
脚本代码无论写在应用下的 tests.py,还是单独开始 test.py 文件都可以 
'''
ORM 中单表常用的方法
1. filter
2. all
3. first
4. last
5. get
6. values
# select name, age from user,  values => 指定获取的数据字段
res = models.User.objects.values('name', 'age')
print(res)  # <QuerySet [{'name': 'EGON', 'age': 18}, {'name': 'egon', 'age': 18}]

7. values_list
res = models.User.objects.values_list('name', 'age')
print(res)  # # <QuerySet [('EGON', 18), ('egon', 18), ('egon1', 19), ('egon2', 20), ('egon3', 21)]>

8.distinct()
# 前提:数据必须一毛一样, 查询的数据带id字段,去重就没有意义了
res = models.User.objects.values('name').distinct()
print(res)

9. order_by()
# select * from user order by age desc, create_time asc
res = models.User.objects.values('name','age').order_by('age')  # 默认是升序
res = models.User.objects.values('name','age','create_time').order_by('-age', 'create_time')  #  降序
print(res)

10.reverse, 必须先排序
res = models.User.objects.order_by('age').reverse()
print(res)

11.count  统计当前个数
res = models.User.objects.filter(name='egon').count()
print(res)

12.exclude()  排除在外

13.exists()  判断数据是否存在
# 基本用不到,因为数据本身自带布尔值

查看内部 SQL 语句的方式

No.1 Scheme
res = models.User.objects.values_list('name', 'age')
print(res.query) 
queryset 对象才能点击 query 查看内部的 SQL 语句

No.2 Scheme -- 所有的 SQL 语句都能查看
需要实现配置 Django 配置文件
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static')
]

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

res = models.User.objects.values_list('name', 'age')
print(res) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值