4.Django模板语法⽂章⽬录
1. FBV与CBV
FBV(基于函数的视图)
CBV(基于类的视图)
Python是⼀个门⾯向对象的编程语⾔。如果我们只⽤函数来编写视图函数,
那么就会造成很多⾯向对象的优点⽆法利⽤起来,⽐如说封装、继承、多态等
1.1 FBV
FBV基于函数的视图
在views.py视图中中定义函数来处理⽤户请求,
函数中再定义如果是GET请求怎么处理,POST请求怎么处理...
0.新建⼀个项⽬,解决template⽂件夹路径错误,注释中间件.
1.项⽬路由层
2.app01视图函数
# 项⽬的路由层
f.urls import url
ib import admin
# 0. 导⼊数图函数
from app01 import views
urlpatterns =[
url(r'^admin/', admin.site.urls),
# 1. FBV ⽅式
url(r'^register/', ister),
]
# app01 的视图层
# 0. 导⼊Python 三板斧
from django.shortcuts import render, HttpResponse, redirect
# 1.定义函数
def register(request):
# 写逻辑
return HttpResponse('index页⾯')
1.2 CBV
CBV基于类的视图
体现了Python⾯向对象这⼀语⾔特性。CBV是通过类的⽅式来编写视图函数.
这相⽐较于函数,更能利⽤⾯向对象中多态的特性,因此更容易将项⽬中⽐较通⽤的功能抽象出来。
*urls.py⽂件中CBV的书写⽅式类名.as_view()⽅式映射,
定义的类需要继承View类,
定义的⽅法按照固定样式,View类中⽀持以下⽅法:
http_method_names=['get','post','put','patch','delete','head','options','trace']
CBV的特点:能根据不同的请求⽅式匹配对应的⽅法执⾏。
0.项⽬路由层
1.app01视图函数
# 项⽬的路由层
# 2. CBV ⽅式
url(r'^login/', views.Login.as_view())
# 2. 导⼊ View 类
from django.views import View
# 3.定义类
class Login(View):
def get(self, request):
return render(request,'login.html')
def post(self, request):
return HttpResponse('Login页⾯ POST 请求') <!--项⽬⽬录下建⽴login.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登⼊页⾯</title>
</head>
<body>
<div>
<form action=""method="post">
<input type="submit">
</form>
</div>
</body>
</html>
3.在浏览器中输⼊:127.0.0.1:8000/login
4.点提交
1.3 CBV源码解析
1.启动程序时
函数名,⽅法名加括号执⾏优先级最⾼。
在启动Django时就会执⾏login.as_view()
Login是类名,类使⽤.as_view()
查看源代码可以得知结果就是views.view
url('^login/',views.Login.as_view())
变形为url('^login/',views.view),
CBV和FBV在路由上本质是⼀样的,都是路由对应函数内置地址。
在输⼊127.0.0.1:8000/login时触发views.view
2.请求来的时候
getattr反射:通过字符串来操作对象的属性或者⽅法
getattr(⾃⼰写的类对象,'⼩写的请求⽅式get/post',当不这个⼩写的请求时才使⽤第三个参数)
不要修改源码,出现bug难查。
在查看源码的时候⼀定要时刻提醒⾃⼰⾯对对象属性⽅法的查顺序。
在查看源码时看到self.东西,⼀定要问⾃⼰当前这个self是谁
1.先从⾃⼰的对象中
2.再去产⽣对象的类中查
3.⽗类中查
# 源码
class View(object):
# http的⽅法名字
http_method_names =['get','post','put','patch','delete','head','options','trace']
# View加括号的时候执⾏
def__init__(self,**kwargs):
# 遍历 kwargs 关键字参数, 通过setattr(对象, 属性, 值)设置默认值
for key, value in six.iteritems(kwargs):
setattr(self, key, value)
# 静态⽅法
@classonlymethod
def as_view(cls,**initkwargs):
# 关键字参数是否符合要求, 不符合就 raise 抛出错误.
for key in initkwargs:
#  关键字参数的变量名必须是 http的⽅法列表中的其中⼀个
if key in cls.http_method_names:
raise TypeError("You tried to pass in the %s method name as a "
"keyword argument to %s(). Don't do that."
%(key, cls.__name__))
# hasattr(cls-->类名, 关键字参数的变量名) 函数⽤于判断对象是否包含对应的属性。
前端页面模板
if not hasattr(cls, key):
raise TypeError("%s() received an invalid keyword %r. as_view "
"only accepts arguments that are already "
"attributes of the class."%(cls.__name__, key))
def view(request,*args,**kwargs):
# self = Login(**initkwargs)
self = cls(**initkwargs)
# 当对象中有get属性 and 没有 head 属性的时候,  get 赋值给 head
if hasattr(self,'get')and not hasattr(self,'head'):
self.head =
# 对象.request 接收  request
# 对象.args 接收位置参数
self.args = args
# 对象.kwargs 接收关键字参数
self.kwargs = kwargs
# 返回对象.dispatch()函数
return self.dispatch(request,*args,**kwargs)
"""
其他的不看了
"""
return view
def dispatch(self, request,*args,**kwargs):
"""
判断请求是否在 http⽅法列表中
如果存在则取去⾃⼰写的类总对应请求名字的⽅法赋值给 handler,
⾃⼰没有写这个请求的⽅法就抛出异常
如果不存在,就将抛出异常的代码赋值给 handler
执⾏handler  handler要么是⾃⼰写的请求⽅法要么是请求不存在http⽅法列表中报错        """
hod.lower()in self.http_method_names:
# ⽅法 =      获取对象中请求⽅法如果没有就抛出错误
handler =getattr(self, hod.lower(), self.http_method_not_allowed) else:
# 不存在抛出错误
handler = self.http_method_not_allowed
return handler(request,*args,**kwargs)
"""
其他的不看了
"""
"""
2. 模板层
2.1 模板语法
模板语法的书写⽅法:
{{变量名}}变量相关
{%%}逻辑相关for循环等
基本的数据类型都可以传递给前端。
模板语法内部会⾃动判断当前的变量(函数名,类名)是否可以加括号调⽤,
如果可以就会⾃定加括号执⾏。
传递函数名会⾃动加括号进⾏调⽤,传递的是返回值.
传递类名的时候也会⾃动加括号实例化,传递的是对象.
*模板语法不⽀持函数传递额外的参数,如果函数带参数则不会执⾏这条模板语法语句。
Django模板语法的取值格式:
1.句点符.键取值
2.可以点索引
3.两者混合使⽤
2.2 测试环境
1. 路由层
# 项⽬的urls.py
# 4.索引
url('^index/', views.index)
2. 视图层
# app01的views.py
# 4.index 模板语法测试
def index(request):
# 返回index.html 页⾯
return render(request,'index.html')
3.前端页⾯
templates⽬录下创建index.html⽂件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板语法测试</title>
</head>
<body>
<h1>模板语法测试</h1>
<!--下⾯写测试的模板语法-->
</body>
</html>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。