Django 模版语法 测试环境 ORM单表查询

模版语法

传值

视图函数向前端html页面传值,基本上所有的数据类型都可以渲染在前端页面上。

views.py

from django.shortcuts import render, redirect, HttpResponse


# Create your views here.

def index(request):
    int_1 = 123
    str_2 = ‘测试‘
    list_3 = [1, 2, 3]
    dict_4 = {‘a‘: 1, ‘b‘: 2}
    set_5 = {1, 2, 3, 4, 5}
    tuple_6 = (1, 2, 3,)
    float_7 = 3.1415926
    bool_8 = True
    return render(request, ‘index.html‘, locals())

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
<p>{{ int_1 }}</p>
<p>{{ str_2 }}</p>
<p>{{ list_3 }}</p>
<p>{{ dict_4 }}</p>
<p>{{ set_5 }}</p>
<p>{{ tuple_6 }}</p>
<p>{{ float_7 }}</p>
<p>{{ bool_8 }}</p>
</body>
</html>

Django 模版语法 测试环境 ORM单表查询

但是需要注意的是函数的渲染,如果在html页面渲染函数的话,不需要加括号就会会直接执行该函数,如果有返回值就会在页面显示返回值,没有返回值会显示None。类里面的函数也可以调用,但是也不要加括号,和flask模版语法不一样。

模版取值直接用点语法。

过滤器

模板过滤器可以在变量被显示前修改它,过滤器使用管道字符

{{ 变量名 | 过滤器:可选参数 }}

length

返回对象的长度,适用于字符串和列表。

字典返回的是键值对的数量,集合返回的是去重后的长度。

def index(request):
  name = ‘isable‘
  return render(request, ‘index.html‘, locals())
{# html页面 #}
{{ name|length }}

{# 输出长度结果 #}

date

根据给定格式对一个日期变量进行格式化。

格式 Y-m-d H:i:s返回 年-月-日 小时:分钟:秒 的格式时间。

import datetime
def index(request):
    ctime = datetime.datetime.now()
    print(ctime)
    return render(request, ‘index.html‘, locals())
{{ ctime|date:‘Y-m-d H:i:s‘ }}

filesizeformat

以更易读的方式显示文件的大小(即‘13 KB‘, ‘4.1 MB‘, ‘102 bytes‘等)。

字典返回的是键值对的数量,集合返回的是去重后的长度。

def index(request):	
  	file_size = 102900291913
    return render(request, ‘index.html‘, locals())
{{ file_size|filesizeformat }}

seaf

将字符串标记为安全,不需要转义。

要保证 views.py 传过来的数据绝对安全,才能用 safe。

和后端 views.py 的 mark_safe 效果相同。

为了防止XSS攻击,Django 会自动对 views.py 传到HTML文件中的标签语法进行转义,令其语义失效,在前端渲染成文本。加 safe 过滤器是告诉 Django 该数据是安全的,不必对其进行转义,可以让该数据语义生效。

from django.shortcuts import renderdef index(request):    views_str = "<script>alert(111)</script>"    return render(request, "index.html", {"views_str": views_str})
{{ views_str|safe }}

标签

for标签

与python中for循环语句类似每一次循环中,模板系统会渲染在 {% for %}{% endfor %} 之间的所有内容。

def index(request):	  l1 = [1, 2, 4, 5, 6]  return render(request, ‘index.html‘, locals())
{% for foo in l1 %}    <p>{{ foo }}</p>{% endfor %}

在 {% for %} 标签里可以通过 {{forloop}} 变量获取循环序号。

  • forloop.counter: 顺序获取循环序号,从 1 开始计算
  • forloop.counter0: 顺序获取循环序号,从 0 开始计算
  • forloop.revcounter: 倒叙获取循环序号,结尾序号为 1
  • forloop.revcounter0: 倒叙获取循环序号,结尾序号为 0
  • forloop.first(一般配合if标签使用): 第一条数据返回 True,其他数据返回 False
  • forloop.last(一般配合if标签使用): 最后一条数据返回 True,其他数据返回 False

继承

模板可以用继承的方式来实现复用,减少冗余内容。

网页的头部和尾部内容一般都是一致的,我们就可以通过模板继承来实现复用。

父模板用于放置可重复利用的内容,子模板继承父模板的内容,并放置自己的内容。

# 父模板 给子模版需要更改的地方括起来 做标记{% block content_name %} 	# 需要更改的内容	{% endblock %}
# 子模板{% entends ‘home.html‘ %}  #继承父模板内容{% block content_name %}	# 子模版内容{% endblock %}

Django测试环境的搭建

将manage.py文件里面的以下代码复制到app文件里面的tests.py:

import osimport sysif __name__ == "__main__":    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangoProject02.settings")        import django    django.setup

需要注意的是 导入其他py文件的时候需要在django.setup()下面写。这时候就直接可以右键运行。

ORM单表中查询的方法

values

# 字段查询res = modes.User.objects.values(‘name‘, ‘age‘)# 列表套字典

values_list

# 字段查询,与values用法一致# 返回值是列表套元组

去重

# 去重不要带主键字段,否则去重就没意义models.User.objects.values(‘name‘).distinct()

排序

res = model.User.object.values(‘name‘, ‘age‘).order_by(‘-age‘)  # 默认是升序  给字段加上负号就是降序

reverse

res = modes.User.objects.order_by(‘age‘).reverse()# 倒序

count

# 统计出现次数res = models.User.objects.filter(name=‘egon‘).count()

Django 模版语法 测试环境 ORM单表查询

上一篇:leetcode1953 你可以工作的最大周数


下一篇:高精度二进制加法