本节内容概要:html
上节回顾及补充知识点:前端
1、请求周期:web
URL-》路由-》函数或类-》返回字符串或者模板ajax
Form表单提交:数据库
提交-》url-函数或者类中的方法django
-....(执行)后端
HttpResponse('......')浏览器
render(request,'index.html')服务器
redirect('/index/')cookie
返回给用户>>>>>用户 永远都是渲染处理完成的字符串
当接收到一个redirect时,自动发起另一个请求
Ajax:
$.ajax({
url:'/index/',
data:{'k':'v'},$(form对象).serilize()
type:'POST',
dataType:'JSON':
traditional:true,(写了这个,才能将$(form对象).serilize()列表的值拿到)
success:function(d){
}
error:{
}
})
提交-》url-》函数或类中的方法
-....(执行)
HttpResponse('......')
render(request,'index.html')
不可使用redirect。。。。。。
返回一个字符串能够,只能ajax后面本身作跳转
2、路由系统URL:
a./index/ ->函数或类
b./index/(\d+) ->函数或类
c./index/(?P<nid>\d+) ->函数或类
d./index/(?P<nid>\d+) name='root' ->函数或类
reverse()
{% url 'root' 1 %}
e./crm/ include('app01.urls') ->路由分发
补充两点:
f. 默认值
/index/ {'web':'root'} 为函数传递一个值的默认值
def func(request,web):
print(name)
return HttpResponse('OK')
g.命名空间 namespace 用于include时定义名字的,和name起名字类似的意义
底下写错了,应为:
v=reverse('author-polls:detail',kwargs={'pk':11})
{% url 'publisher:detail' pk=12 pp=99 %}
3、视图系统
def func(request):
request.POST
request.GET
request.FILES
request.getlist
request.method
request.path_info
return render,HttpResponse,redirect
四、模板引擎
render(request,'index.html')
# for
# if
# 索引. keys values items all 都不加括号
五、MODEL数据库操做
A、建立类 创建数据库表
class User(models.Model):
username = models.CharField(max_length=32)
email=models.EmailField()
(Django Admin:有验证功能)
User.objects.create(username='',email='dfadfasdfasdf')
User.objects.filter(id=1).update(email='666')
(无验证功能)
B、一对多操做
class UserType(models.Model):
name = models.CharField(max_length=32)
class User(models.Model):
username = models.CharField(max_length=32)
email=models.EmailField()
user_type=models.ForeignKey("UserType")
user_list = User.objects.all()
for obj in user_list:
obj.username,obj.email,obj.user_type_id,obj.user_type.id,obj.user_type.name
user=User.objects.get(id=1) 单个对象
user.
User.objects.all().values("username","user_type__name") 跨表取数据的双下划线方式
C、多对多操做:
class UserType(models.Model):
name = models.CharField(max_length=32)
class User(models.Model):
username = models.CharField(max_length=32)
email=models.EmailField()
user_type=models.ForeignKey("UserType")
m=models.ManyToMany("UserGroup")
class UserGroup(models.Model):
name=...
obj=User.objects.get(id=1)
obj.m.add(2)
obj.m.add(2,3)
obj.m.add(*[1,2,3]) 注意,跟列表须要前面加一个*号
obj.m.remove(......)
obj.m.clear()
obj.m.set([1,2,3,4,5,6]) set跟列表时,不加*号,只保留当前这些列出来的关系
obj.m.all()
#多个组的对象,当前用户全部的组
obj.m.filter(name='CTO')
Views模块补充知识点:
请求的其余信息:
不只发送数据,还要发送请求头
下面咱们来看一下请求头中都有些什么内容能够被使用:
请求的东西都存放在request中,因此根据request对象找到建立他的类WSGIRequest进行查看:
print(type(request))
#封装了全部用户请求的信息
print(request.environ) 返回全部原生数据
若是是经常使用的,则能够调用request.GET或者request.POST请求处理数据
若是不在其中,只能本身经过environ处理原生数据了
for k,v in request.environ.items():
print(k,v)
能够看到全部请求相关的信息,以字典方式存放
print (request.environ['HTTP_USER_AGENT'])
模板Template知识点补充:
模板的继承:
母版:master.html
继承的子网页:extends
母版能够在CSS样式和JS引入的后面分别跟一个block块,为了子页面能够自定义样式和JS脚本的地方。
子页面中写block内容的顺序与显示无关,能够随意写了
一个子页面只能继承一个母版
模板的引入:include
一个页面只能继承一个母版,但能够include多个html
include的文件也是支持渲染的,Django会先拼凑整合起带各类模板语言标签的文件,最终渲染成一个html
OpenStack后台管理中就有大量的include调用
模板语言内置函数了解
自定义Simple tag:步骤
一、在应用中建立一个叫templatetag的目录,不能叫其余名字
二、在目录中建立任意取名的py文件
三、在py文件中写函数,函数名定义前面要加装饰器,先要建立一个template对象,命名必须叫register
register = template.Libary()
四、经过它去生成一个装饰器
@register.simple_tag
def func(a1,a2...)
这两部的步骤代码如图所示:
五、使用自定义函数前须要注册当前APP
六、想在哪一个html页面使用这个自定义函数时,须要在html的顶部load一下 {% load xxoo%}
g、调用时只能用{% %}
h、传参使用空格,多个空格也不要紧。
调用自带函数
调用自定义函数:
自定义时有两种方式:
@register.simple_tag 优势:能够多个参数,能够带空格 缺点:不能做为if条件
@register.filter 缺点:只能最多两个参数,不能有空格 优势:能够应用于{% if %}的条件
调用方式同自带函数:{{”参数1”|函数名:”参数2”}}
若是要传多个参数,只能拼凑多个参数成一个字符串传给这两个参数中:
{{“参数1”|函数名:“参数2,参数3”}}
{{”参数1”|”函数名:数字}}
*********PS:若是既有用到extends又用到load,在页面顶部先写extends语句,再写load **********
自定义分页:
前置说明 django自带保护,以免XSS攻击:
若是要将html部分标记语言放到后端生成后返回给前端,不能在前端直接显示成html内容,只会以字符串形式显示出来
若是要想转换成html内容让浏览器解析标记语言并显示结果,须要说明一下:
两种方式:1 前端 写一个filter过滤
前端:{{ content|safe }}
or 2 后端将字符串包装
from django.utils.safestring import mark_safe
page_str = "...."
page_str = mark_safe(page_str)
分页逻辑:
上一个、下一个、跳转:
最后能够把分页代码整合成一个class类,使用的时候初始化并调用类中的方法便可
若是调用对象的方法,不想加括号的办法,在方法的命名上方增长:@property
在后台分页回传字符串的类方法中增长url参数后,能够真正将这部分分页代码作成一个模块,用于各个地方了。
将类提取出来单独存放,之后能够方便的引入调用。
代码已有,能够针对该类进行使用练习。
Cookie:
存储在了客户端浏览器本地文件中的一个与用户有关的键值对,
经过审查元素->network,发一次请求,找到cookies,就能看到请求的cookies内容
注销时,能够从新设置Cookie的超时时间,让退出后失效。
设置Cookie:response.set_cookie("")
读取Cookie:request.cookies.get("")
基于Cookie的数据显示条目:
Cookie在服务器端、客户端均可以读写
可使用jQuery的插件Jquery.cookie简单调用,代码以下:
Cookie 加密:
加密加盐相似hashlib加密方式:
用装饰器实现用户认证:
多页面中不须要单独每一个页面再认证了
FBV装饰器写法:
CBV装饰器写法:
或
类中装饰器能够在函数方法名前写,更能够直接在类名前写
做业题:
主机管理:
一、单表操做
二、一对多
三、多对多
要求:
a.删除对话框
b.修改、添加时,使用新URL的方式
c.基于cookie进行用户认证(本身写装饰器)
d.定制显示数据条数
e.分页
预习:
Form组件:http://www.cnblogs.com/wupeiqi/articles/6144178.html
Models操做:http://www.cnblogs.com/wupeiqi/articles/6216618.html