在实际开发过程中,一个Django 项目会包含很多的 app,这时候如果我们只在主路由里进行配置就会显得杂乱无章,所以通常会在每个app 里,创建各自的 urls.py 路由模块,然后从根路由出发,将 app 所属的 url 请求,全部转发到相应的 urls.py 模块中。而这个从主路由转发到各个应用路由的过程叫做路由的分发。
# 使用ur1给视图函数传参数
path('index/',index)
path('detail//", detail)
# 给ur1取别名,那么在使用此ur1的地方可以使用别名。比如:
path('index/',index, name='index')
path('detail//", detail, name='detail')
在实际应用中,Django中可能存在多个应用程序,每个应用程序都可能有自己的路由模块。为了防止路由冲突,Django提供了命名空间(namespace)的概念。命名空间是一种将路由命名为层次结构的方式,使得在查询路由时可以限定在该命名空间内
一定要传入元组
# 在根路由中可以设置命名空间
path('app/",include((App,urls',"App"),namespace='App'))
在模版html文档中可通过2种方式实现路由跳转
需要注意的是,写了命名空间,在视图函数和html文档中都要使用命名空间,没有使用命名空间则都不能使用
多个参数,要和参数名一致,类似于关键字传参
Django路由反向解析是一个非常重要的功能,它可以让我们在代码中使用路由别名替代URL路径,在修改URL时避免代码中的硬编码依赖,同时也可以提高可读性和可维护性。
#在视图函数中,反向解析ur1:
from django.shortcuts import render, redirect, reverse
def buy(request):
return redirect(reverse("index'))
return redirect(reverse('deta11",args=[2]))
return redirect(reverse("deta11",kwargs=("1d": 2)))
# 在templates中,使用别名:
(% url 'detail' stu,id %)
重定向
在Django框架中,模板是可以帮助开发者快速生成量现给用户页面的工具
模板的设计方式实现了我们MVT中VT的解(M: Model,V:View,T:Template),VT有着N:M的关系,一个V可以调用任意T,一个T可以供任意V使用 MVC
模板处理分为两个过程
加载HTML
渲染数据
模板主要有两个部分
· HTML静态代码
模板语言,动态插入的代码段(挖坑,填坑)
模板中的动态代码段除了做基本的静态填充,还可以实现一些基本的运算,转换和逻辑
静态页面:页面数据是本地固定的
动态页面:页面数据来源于后台服务器
模板中的变量:视图传递给模板的数据,遵守标识符规则
语法: (( var ]}
如果变量不存在,则插入空字符串
方法不能有参数
{{str }}
{{ str.upper }}
{{ str,isdigit}}
{{ dict.key}}
列表,使用索引,不允许负索引
items= ['apples" 'bananas", 'carrots']
{( items.2 })
模板中的标签
语法{% tag %)
作用
1.加载外部传入的变量
2.在输出中创建文本
3,控制循环或逻辑
在模版中,列表需要以.1的形式书写(字典以.key的形式书写)
标签都要使用{% %}表示
if 语句:
格式
if单分支
{% if 表达式 %}
语句
{% endif %}
if双分支
{%if 表达式 %)
语句
{% else %}
语句
{% endif %}
if多分支
{% f 表达式 %}
语句
{% elif 表达式 %}
语句
{% else %}
语句
{% endif %}
注意变量和符号一定要加空格
判断true或false
{% if today_is_weekend %}
Welcome to the weekend!
Both athletes and coaches are available.
{% endif %}There are no athletes.
There are some athletes or some coaches.
使用 in和noqin,
{% if"bc" in "abcdef" %}
This appears since "bc" is a substring of "abcdef"
{% endif %}
{% if user not in users %}
If users is a list, this will appear if user isn't an element of the list.
{% endif %}
for 语句:
{% for 变量 in 列表%}
语1
{% empty %}
语2
{% endfor %}
当列表为空或不存在时,执行empty之后的语句
forloop有很多属性,可以对下标进行操作
格式为|操作:(操作数)的形式
过滤器可以传递参数,参数需要使用引号引起来比如join:{{ studentsljoin:'=' })
默认值:default,格式 {{varldefault:value}}
如果变量没有被提供或者为False,空,会使用默认值
根据指定格式转换日期为字符串,处理时间的就是针对date进行的转换
{[ dateVal l date:'y-m-d' }}
HTML转义
将接收到的数据当成普通字符串处理还是当成HTML代码来渲染的一个问题
渲染成html:
{{codelsafe }}
打开自动转义转义、关闭自动转义
{% autoescape off%}
code
{% endautoescape %}
block:
{% block xxx%}
code
{% endblock %}
extends 继承,写在开头位置
{% extends “父模板路径”}
include:加载模板进行渲染
{% include ‘模板文件’%}
{{ block.super }}: 获取父模板中blocke的内容
默认情况下,子模板会覆盖义模板的内容 #
# 如果想将文模板中bLock的内容继承,则需要使用block.super #}
Jinja2是Flask框架讲过的一个模板引擎,是模仿Django默认模板引擎基础上开发的,比Django模板引擎性能更好,功能更全。jinja2宣称比django默认模板引擎快10-20倍。Django也支持jinja2
1.安装jinja2模块
pip install jinja2
⒉.在settings.py所在目录中创建jinja2_env.py文件,并写入以下内容
from django.templatetags.static irport static
from django.urls irport reverse
from jinjo2 impcrt Envircnment
def environment(**cptions):
env = Ervircnment(**options)env .globals.update({' static' : static,"url' : revcrsc,})
return env
修改setting中的template
pycharm设置为jinja2
注意:使用jinjia2模板语法大多数与django相同,但是有一些区别:例如:
1.jinjia2中不能使用forloop,能够使用loop.
2.jinjia能支持有参数的函数调用,而django不支持。