Django views(视图函数)
处理请求
redirect()
return redirect(‘/login/’) 视图函数下条件判断后返回跳转到登录页面
# 引入redirect
from django.shortcuts import render,HttpResponse,redirect
import time
def regist(req):
# 走POST请求
if req.method == "POST":
# 打印form表单提交的信息
print(req.POST.get('user'))
print(req.POST.get('age'))
user = req.POST.get('user')
if user == 'admin':
return redirect('/login/')
return HttpResponse('success!')
return render(req, 'regist.html')
视图函数的locals()用法
urls.py
urlpatterns = [
url(r'^show_time/', views.show_time),
]
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--用的比较多的引用-->
<!--此处没有引用页面无法显示-->
{% load staticfiles %}
<title>Title</title>
</head>
<body>
<!-- name,t 均为视图函数show_time的局部变量-->
<h1>Hello {{ name }} 时间:{{t}} {{ req.method }}</h1>
</body>
</html>
views.py
def show_time(req):
t = time.ctime()
name= 'chs'
# locals() 渲染视图函数的局部变量到html中
return render(req, 'index.html', locals())
视图函数内的render()
渲染函数
render(req, ‘login.html’) 渲染login.html页面百度百科 视图渲染函数render() 与 视图跳转页面函数redirect()的区别
Template基础
模板系统的介绍
与前端交互的模板
(一)模板语言
组成: HTML代码 + 逻辑控制代码
(二)逻辑控制代码的组成
1 变量(使用大括号来引用变量)
语法格式: {{ var_name }}
在Terminal命令行输入命令: python manage.py shell 进入当前django项目的环境下
.
关于python 与 前端的交互,将后台变量渲染到页面
在应用下创建模板文件夹
需要创建和项目下的模板文件名相同的名字(原因: 'APP_DIRS': True,)
在模板设置下的 'APP_DIRS': True,表示在应用下寻找与项目下同名的文件夹
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
关于模板的变量
urls.py
from django.contrib import admin
from django.conf.urls import url
from app0 import views
urlpatterns = [
url(r'^Query', views.Qurey),
]
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>hello {{ action.0 }}</h1>
<h1>hello {{ action.1 }}</h1>
<h1>hello {{ d.name }}</h1>
<h1>hello {{ d.age }}</h1>
<h1>hello {{ d.hobby }}</h1>
<h1>hello {{ c.name }}</h1>
<h1>hello {{ c.sex }}</h1>
</body>
</html>
views.py
class Animal():
def __init__(self, name, sex):
self.name = name
self.sex = sex
def Query(request):
l = ['越今朝', '越祁', '云天河']
d = {'name': '慕容紫英', 'age': 20, 'hobby': '123'}
c = Animal('alex', '母')
return render(request, 'index.html', {'action': l, 'd': d,
'c': c,})
# return render(request, 'index.html', locals())
关于模板的过滤器
变量的过滤器(filter)的使用
语法格式: {{ obj | filter : param }}内置函数
1. add : 给变量加上相应的值
2. addslashes : 给变量中的引号前加上斜线
3. capfirst : 首字母大写
4. cut : 从字符串中移除指定的字符
5. date : 格式化日期字符串
6. default : 如果值是 False ,就替换成设置的默认值, 否则就是用本来的值
7. default_if_none : 如果值是None, 就替换成设置的默认键,否则就使用本来的值
内置函数实例
views.py
def Query(request):
t = datetime.datetime.now()
test = 'hello python'
num = 10
test1 = 'hel lo py th on'
e = []
a = '<a href="http://www.baidu.com" target="_blank">点击我</a>'
return render(request, 'index.html', locals())
index.html
<h1>慕容紫英的年龄{{ d.age | add:12 }}</h1>
<h1>{{ test | cut:'on' }}</h1>
<h1>{{ test1 | cut:' '}}</h1>
<!--将时间转化成数字格式-->
<h1>{{ t | date:'Y-m-d'}}</h1>
<!--如果值是 False ,就替换成设置的默认值, 否则就是用本来的值-->
<h1>{{ e | default:'空的列表'}}</h1>
<!--后台通过过滤器内置函数safe渲染前端a标签-->
<h1>{{ a | safe }}</h1>
<!--渲染效果同上-->
{% autoescape off %}
<h1>{{ a }}</h1>
{% endautoescape %}
条件判断与循环遍历
python后台模板条件判断语句与for语句渲染页面
views.py
def Query(request):
t = datetime.datetime.now()
l = ['越今朝', '越祁', '云天河']
d = {'name': '慕容紫英', 'age': 35, 'hobby': '123'}
c = Animal('alex', '母')
test = 'hello python'
num = 10
test1 = 'hel lo py th on'
e = []
a = '<a href="http://www.baidu.com" target="_blank">点击我</a>'
return render(request, 'index.html', locals())
index.html
python页面渲染语句{{% tag %}}
<!--if-else渲染语句-->
{% if d.age > 25 %}
{% if d.age < 50 %}
<h1>{{ d.name }}的年龄在20~50之间</h1>
{% else %}
<h1>hello {{ d.name }}</h1>
{% endif %}
{% elif d.age > 18 %}
<h1>{{ d.name }}的年龄大于18</h1>
{% else %}
<h1>{{ d.name }}的年龄小于18</h1>
{% endif %}
<!--for循环渲染语句-->
{% for name in l %}
<!--按索引格式显示(计数器)-->
<h1>{{ forloop.counter0 }} : {{ name }}</h1>
<!--倒序计数器-->
<h1>{{ forloop.revcounter }} : {{ name }}</h1>
{% endfor %}
<!--将l中第一个值改变颜色-->
{% for name in l %}
{% if forloop.first %}
<li class="first">
{% else %}
<li>
{% endif %}
{{ name }}
</li>
{% empty %}
<h1>l为空</h1>
{% endfor %}
页面效果
表单渲染验证
urls.py
from django.contrib import admin
from django.conf.urls import url
from app0 import views
urlpatterns = [
url(r'login/', views.login, name="login")
]
index.html
<form action="{% url 'login' %}" method="post">
<p>姓名:<input type="text" name="user"/></p>
<p>密码:<input type="password" name="pwd"></p>
<p><input type="submit"></p>
<!--添加下面语句表示身份验证,否则第一次访问报错禁止访问-->
<!--没有以下语句第二次访问可以正常访问-->
{% csrf_token %}
</form>
views.py
def login(request):
return HttpResponse('OK')
关于标签tag(写在模板中的语法)
{% with %}: 用更简单的变量名替代复杂的变量名
{% with total=sajldjalisfjaijsaf %} {{ total }} {% endwith %}
.
.
.
{% verbatim %}: 禁止render
# 页面直接显示{{ hello }}
{% verbatim %}
{{ hello }}
{% endverbatim %}
如果自定义过滤器filter (常用,重点)
{% load … %}: 加载标签库
关于filter装饰器与simple_tag装饰器的区别
filter可以用在if等语句后, simple_tag不可以
eg: {% if num | filter_multi:30 > 100 %}
{{ num | filter_multi:30 }}
{% endif %}
1.创建一个templatetags python package
在应用下New -> python package -> 命名为templatetags
2.在templatetags目录下创建一个自定义.py文件
from django import template
from django.utils.safestring import mark_safe
register = template.Library() # register的名字是固定的,不可改变
# 以上为第一步 固定引用,需要牢记
#第三步: 加载引用, 在settings.py中APPS中添加配置(django自动分配)
# 第二步: 自定义一个乘法方法, 必须调用filter装饰器
# 调用了filter装饰器需要借用管道符 | 后面做区别
@register.filter
def filter_multi(x, y):
return x * y
# 调用标签装饰器 语法与之前不一样
@register.simple_tag
def simple_tag_multi(x, y):
return x * y
3.在index.html模板中写语法
首先加载引用,以创建my_tags.py为例
{% load my_tags %} 写在第一行
<!--执行自定义标签filter_multi-->
<!--需要借用管道符 | -->
{{ d.age | filter_multi:3 }}
<!--自定义标签不需要借用管道符-->
<!--d.age和15 对应自定义标签方法的形参-->
{% simple_tag_multi d.age 15 %}
页面显示结果
django模板继承extends和添加标签include
模板继承extends
{% extends … %} 必须保证放在模板中的第一行,否则将不起作用
{{ block.super }} 继承模板盒子内原先的内容
1.添加路径
urls.py
from django.contrib import admin
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^backend', views.backend),
url(r'^student', views.student),
url(r'^teacher', views.teacher),
]
2.编写视图函数 views.py
from django.shortcuts import render
# Create your views here.
def backend(request):
return render(request, 'base.html')
def student(req):
student_list = ['越今朝', '越祁', '明秀', '居十方']
return render(req, 'student2.html', locals())
def teacher(req):
teacher_list = ['涂军', '宋卫华', '乐清菊']
return render(req, 'teacher.html', locals())
3.写一个供继承的首页模板 base.html
例如编写教务系统网站,点击学生管理后只需要变更部分div内的内容时,采用继承消除代码冗余
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
a{
text-decoration:none;
color: darkviolet;
}
a:hover{
color:purple;
}
*{
margin:0;
padding:0;
}
.nav{
line-height: 40px;
width:100%;
background-color: indigo;
color:white;
font-size:20px;
text-align: center;
}
.left{
width:20%;
min-height:600px;
overflow:auto;
background-color: #ccc;
}
.manage{
text-align: center;
padding:15px;
margin:20px;
font-size:18px;
}
.left,.content{
float: left;
}
.content{
width:70%;
min-height:600px;
border:1px solid red;
}
h2{
text-align: center;
}
</style>
</head>
<body>
<div class="outer">
<div class="nav">标题</div>
<div class="left">
<div class="student manage"><a href="/student/">学生管理</a></div>
<div class="teacher manage"><a href="/teacher/">老师管理</a></div>
<div class="course manage"><a href="">课程管理</a></div>
<div class="classes manage"><a href="">班级管理</a></div>
</div>
<div class="content">
<!--相当于定义一个盒子,在不同页面盒子内容不一样-->
{% block content %}
<h2>Welcome to CQ !</h2>
{% endblock %}
</div>
</div>
</body>
</html>
其中需要继承后修改的的内容用{% block 类名 %}{% endblock %}括起来形成一个供修改内容的盒子
首页页面效果
- 点击a标签实现页面跳转
<div class="student manage"><a href="/student/">学生管理</a></div>
步骤:
(1).点击a标签
(2).django通过href在urls.py中找到/student/路径,并匹配其对应的视图函数
url(r’^student’, views.student),
(3)django,通过路径匹配的视图函数在views.py中找到方法student,并实现其函数功能
def student(req):
student_list = ['越今朝', '越祁', '明秀', '居十方']
return render(req, 'student2.html', locals())
(4)django实现函数并返回用户页面 student2.html
student2.html
{% extends 'base.html' %}
{% load staticfiles %}
{% block content %}
{{ block.super }}
<h1>学生信息:</h1></br>
{% for student in student_list %}
<h2>{{ student }}</h2>
{% endfor %}
{% include 'test.html' %}
{% endblock %}
此处{% extends ‘base.html’ %} 继承base.html的内容
盒子内容{% block content %}{% endblock %}可对需求进行相应修改
添加标签include
承上
在templates目录下新建一个test.html
test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 style="color:red">Hello World</h1>
</body>
</html>
想要在student2.html中添加标签
{% extends 'base.html' %}
<!--添加标签include的引用-->
{% load staticfiles %}
{% block content %}
{{ block.super }}
<h1>学生信息:</h1></br>
{% for student in student_list %}
<h2>{{ student }}</h2>
{% endfor %}
{% include 'test.html' %}
{% endblock %}
引用 {% load staticfiles %}
在需要添加的地方 添加 {% include ‘test.html’ %} 即可