views视图函数-模板语法
⼀、Django基础–views视图函数
“这是我参与更⽂挑战的第2天,活动详情查看: 更⽂挑战”
视图 CBV和FBV
FBV
function based view ,平常⽤函数写的就是FBV
CBV
class based view ,⽤⾯试对象的⽅式就是CBV
from django.views import View
class xxx(View):
def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)#其实
def get(self,request):
#专门处理get请求
return response
def post(self,request):
#专门处理post请求
return response
url(r"xx/",xxx.as_view()) # 类名.as_view()执⾏
as_view()的流程
1. 项⽬运⾏时加载urls.py⽂件,执⾏类,as_view()⽅法
2. as_view()执⾏后,内部定义了⼀个view函数,并且返回.
3. 请求到来的时候,执⾏view函数
1. 实例化类--> self
2. quest = request
3. 执⾏self.dispath(request,*args,**kwargs)⽅法
1. 判断请求⽅式是否被允许
1. 允许: - 通过反射获取请求⽅式对应的请求⽅法--->handler f.html_method_not_allowed -->handler
2. 不允许:- self.http_method_not_allowed -->handler
2. 执⾏hanlder,返回结果
# http_method_names = ['get'] #只允许提交的请求⽅法,内部执⾏View这个函数的时候,就会先访问这个类,这个http_method_names就会覆盖内部的这个⽅法
def dispatch(self, request, *args, **kwargs):
print("dispatch执⾏前的操作")
ret = super().dispatch(request, *args, **kwargs)#其实就是执⾏View⾥⾯内部的dispatch⽅法
print("dispatch执⾏后的操作")
return ret
CBV执⾏get和post⽅法前会,先执⾏dispatch⽅法
使⽤过程CBV
1. 写url url(r"^books/$", views.books.as_view()),
2. 在视图函数写⽅法
# url.py
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r"^books/$", views.books.as_view()),
]
# views.py
from django.views import View
class books(View):
def dispatch(self, request, *args, **kwargs):
print("1")
func = super().dispatch(request, *args, **kwargs)
print("2")
return func
def get(self, request):
# 专门处理get请求
return render(request, "login.html")
def post(self, request):
# 专门处理post请求
user = ("user")
password = ("password")
user_obj = models.User.objects.filter(username=user, password=password)        if not user_obj:
return render(request, "login.html")
return render(request, "index.html")
FBV,CBV加装饰器
FBV加装饰器
直接加在函数上就⾏了
CBV加装饰器
需要使⽤⼀个装饰器,导⼊包method_decorator
from django.utils.decorators import method_decorator
@method_decorator 是将函数装饰器转换成⽅法装饰器。
1. 加在⽅法上
@method_decorator(timer)
def get(self, request): #这样就只能get⽅法可以⽤
2. 加在dispatch⽅法上
@method_decorator(timer) #⾥⾯的定义的请求⽅法都可以⽤
def dispatch(self, request, *args, **kwargs):
print(“dispatch执⾏前的操作”)
ret = super().dispatch(request, *args, **kwargs)#其实就是执⾏View⾥⾯内部的dispatch⽅法print(“dispatch执⾏后的操作”)
return ret
3. 加在类上
@method_decorator(timer,name=“get”)
@method_decorator(timer,name=“post”)
@method_decorator(timer,name=“dispatch”)
class PublishersAdd(View): #加在类上,可以指定对应的⽅法
装饰器:timer
# 统计时间的装饰器
import time
from functools import wraps
def timer(func):
@wraps(func)
def inner(*args, **kwargs):
"""
inner内部函数
"""
start = time.time()
ret = func(*args, **kwargs)
print("执⾏⼀共⽤时:{}".format(time.time() - start))
return ret
return inner
@timer
def func():
"""
我是func函数
"""
time.sleep(0.5)
print("aaaa")
func()
print(func.__name__)  #打印函数名 inner (只有加 @wraps(func),才可以输出func,⾃⼰的函数名)
print(func.__doc__) #打印函数中的注释
from functools import wraps
@wraps(func) #加wraps才可以输出⾃⼰的函数,和注释,不然会输出内部函数⾥⾯
request(请求)
常⽤属性:
request.GET  URL上携带的参数  ?k1=v1$k2=v2 {}
request.POST post请求提交的数据 {} 编码⽅法是URLencode
request.path_info  路径信息不包含IP和端⼝也不包含参数    /publisher_list/
request.body 请求体,byte类型 request.POST的数据就是从body⾥⾯提取到的(获取的是post请求提交的内容) request.COOKIES cookies
request.session session类似于字典的对象
request.FILES  上传的⽂件
request.META  头的信息⼩写-->⼤写  HTTP_开头
不常⽤属性:
request.scheme() http或https
request.path() 表⽰请求的路径组件(不含域名)
常⽤⽅法:
<_full_path()    完整的路径信息不包含IP和端⼝ ,包含参数
request.is_ajax()  请求是否是ajax请求
response(响应)
from django.shortcuts import render, HttpResponse, redirect
HttpResponse("字符串")  #返回字符串
render(request,"模板的⽂件名",{'k1':v1})  #返回⼀个HTML页⾯
redirect('地址') #重定向其实就是给了 Location '地址'和状态码 301 302
from django.http import JsonResponse
def text_json(request):
a = {"a":"b"}
b = ["aa","bb"]
return JsonResponse(b,safe=False)  #加safe=False了可以传递列表
⼆、Django基础–模板语法
模板常⽤语法
return render(request,“模板的⽂件名”,{“k1”:“xxx”}) #返回⼀个HTML页⾯
1. Django模板中只需要记两种特殊符号:
1.1 {{ }}和 {% %}
1.2 {{ }}表⽰变量,在模板渲染的时候替换成值,{% %}表⽰逻辑相关的操作。
2. 点(.)在模板语⾔中有特殊的含义,⽤来获取对象的相应属性值
数字:{{ num }}
字符串:{{ string }}
字典:{{ name_dict }} --> {{ name_dict.keys }} --> {{ name_dict.values }} --> {{ name_dict.name }}
列表:{{ name_list }} --> {{ name_list.2 }}
集合:{{ set }} --> {{ set.1 }}
元组:{{ tup }} --> {{ tup.0 }}
类:{{ person }} --> {{ person.name }} --> {{ person.talk }}
.
.索引 .key .属性 .⽅法(⽅法后⾯不加括号)
优先级:
.key > .属性 .⽅法 > .索引
过滤器
过滤器的语法: {{ value|filter_name:参数 }}
使⽤管道符"|"来应⽤过滤器。
1. 过滤器:Filters
return render(request,“template_text.html”,{“new_num”:""})
{{变量|过滤器:“参数”}}
default:
变量不存在或者为空时使⽤默认值 ,如果value值没传的话就显⽰nothing
django admin 自定义页面{{ new_num|default:“2” }}
2. filesizeformat
将值格式化为⼀个 “⼈类可读的” ⽂件尺⼨(例如 ‘13 KB’, ‘4.1 MB’, ‘102 bytes’, 等等)return render(request, “template_text.html”, {“value”: 1024 * 1024 * 1024})
{{ value|filesizeformat }} # filesizefomrat:1.0 GB
3. add +
给变量加参数
数字的加法,字符串和列表的拼接
add:{{ value2|add:“2” }} --> 列表相加:{{ name_list|add:name_list }} #add:4 --> 列表相加:[‘张三’, ‘李四’, ‘王五’, ‘张

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