Django老男孩笔记进阶

Django的模板系统

  • 主要记住两种语法
    {{ }}{% %}
    变量相关的用{{}}, 逻辑相关的用{% %}

示例:
变量

  1. {{ name }} 变量
  2. for循环:
{% for i in book_list %}
  {{forloop.counter}}
  {{forloop.last}}
  {{i}}
{% endfor %}
  1. if判断
{% if 10 > 5 %}
{% else %}
{% endif %}
  1. if ... in 判断
{%  if name in name_list %}
{% endif %}

变量

当模板语言中遇到一个变量的时候,它会先去计算这个变量的值,如果有值,就用这个值代替原来的变量,如果这个值不存在,就不显示.
模板语言中.具有特殊的含义,当系统遇到.的时候会按照如下的顺序查询

  • 1.字典查询
  • 2.属性或者方法查询
  • 3.数字索引查询

注意: 如果计算结果是一个方法,可以调用的,它将作为一个无参数来调用.调用的结果将作为模板的值.如果使用的变量不存在,模板系统将用空字符串来代替

filter(过滤器)
语法: {{value|filter_name:参数}}

  • default
    如果一个变量是false或者为空,则使用给定的默认值,否则,使用变量的值
{{ value|default:"nothing"  }}

如果value没有传值或者值为空的话就显示nothing

  • filesizeformat
    将值格式化为一个人类可读的文件尺寸(例如 '13kb','4.1 MB',默认原来的单位是字节)
<p>文件大小: {{ file_size|filesizeformat }}</p>
  • length
    返回值的长度,作用于字符串和列表
返回value的长度,如果是value=['a','b','c','d']的话就显示4
  • slice
    切片 类似于python的列表和字符串切片,只是写法不同,这里使用字单引号包起来,中间用分号分割.
<p>切片: {{ name_list|slice:"1:-1" }}</p>
<p>切片: {{ name|slice:"0:-1" }}</p>
  • date
    格式化
{{  value|date: "Y-m-d H:i:s "}}
<p>时间: {{ now|date:"Y-m-d H:i:s" }}</p>

经过格式化后就变成下面这样


  • safe
    Django模板中默认会对是HTML标签和JS语法的标签进行字段转义,将其当成字符串显示到页面上.这样做的原因显而易见,
    是为了安全,但是有时候我们自己写代码的时候,也许需要自己添加一些标签或者js代码,这个时候,希望解除这种转义,让其把我们写的字符串当成是html标签或者是js,这个时候就可以使用value|safe的方法

如果没有使用safe,页面是这么显示的

<p>标签显示: </p>{{ html_str }}

当成了一个字符串显示到页面上.

如果使用了safe,则会当成一个标签嵌入到当前页面

<p>标签显示:</p>{{ html_str|safe }}
  • truncatechars
    如果字符串字符多于指定的字符数量,那么会被截断.截断的字符串将以可翻译的省略号序列('....')结尾
    参数,要截取的字符串的长度
<p>截断的字符串:{{ truncate_chars|truncatechars:9 }}</p>
  • 自定义filter
    自定义过滤器的使用步骤
    1. 首先是在app中创建一个模块名字叫templatetags,然后建立一个存放自定义的filter的文件

2. 然后在自己创建的.py文件中,定义并注册自己定义的想要使用的filter

使用我们自定义的filter

{% load app01_filters %}
<p>自定义filter的使用: {{ name|sb }}  {{ name|addstr:'第二个参数加起' }}</p>

注意, 这里加载模板的时候必须先重新启动项目,不然找不到对应的模块

for 循环

  • for 循环可以使用的一些参数


  • for ... empty
    当for循环没有任何数据的时候,需要显示的内容可以写到empty的后面.

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li>
{% endfor %}
</ul>

if 判断

with

csrf_token

注意

母版

  • 母版和继承
  1. 为什么要有模板和继承:
    把多个页面公用的部分提取出来,放在一个母版里面.其他的页面只需要继承母版就可以了.
  2. 具体的使用步骤:
    1> 把公用的HTML部分提取出来,刚到base.html文件中,其他的页面只需要继承母版就可以了
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="x-ua-compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Title</title>
  {% block page-css %}
  
  {% endblock %}
</head>
<body>

<h1>这是母板的标题</h1>

{% block page-main %}

{% endblock %}
<h1>母板底部内容</h1>
{% block page-js %}

{% endblock %}
</body>
</html>

组件 include

静态文件相关

simple_tag
和自定义的filter类似,但是它可以接受任意个参数,并且它在使用的时候并不需要使用管道符.

1. 在templatetags下创建一个py文件simple_tag.py,然后在里面定义一个函数,并注册

2. 使用的时候,也是先加载

inclusion_tag
多用于返回html代码片段

Django的视图系统

视图的作用:
接受web请求并且返回web响应
无论视图本身包含什么逻辑,都要返回响应.我们一般约定视图写到对应的app的views.py中

FBV 和 CBV

Request对象和Response对象
当一个页面被请求的时候,Django会创建一个包含本次请求的信息的HttpRequest对象.
Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用request参数来接收这个对象.

Request 对象

上传文件
对应的html写法

上传文件的逻辑,注意使用的是chunks()

Response对象

httpResponse的使用

JsonResponse
JsonResponse是HttpResponse的子类


使用JsonResponse代替原来的json.dumps()

如何使用JsonResponse处理非字典的数据类型呢?

image.png

路由系统

Django的路由系统的概述
URL配置(URLconf)就像是Django所创建的网站的目录.它本质上是URL和该URL要调用的视图函数之间的映射表
Djang就是用这种方式告诉程序,对于这个URL调用这段代码,对于那个URL调用那段代码.

正则表达式详解



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容