版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
视图
类视图(CBV)
-
函数视图(FBV)
-
作用:可以将视图对应的不同请求方式以类中的不同的方法来区别定义
class Index(View):
def get(self, request, *args, **kwargs):
name = request.GET.get('name')
age = request.GET.get('age')
print(name, age)
return HttpResponse(name+age)
def post(self, request, *args, **kwargs):
name = request.POST.get('name')
age = request.POST.get('age')
print(name, age)
return HttpResponse('post')
- 类视图的好处:
- 代码可读性好
- 类视图相对于函数视图有更高的复用性,若其他地方需要使用该视图,直接继承即可
类视图装饰器
- 在类中使用装饰器时,不能直接添加装饰器,需要使用method_decorator将其转换为适用于类视图的装饰器
- method_decorator装饰器使用name参数指明被装饰的方法
# 定义装饰器模板
def outer(func):
def inner(request, *args, **kwargs):
# request.Response('我是一个装饰器')
print(request.method)
func(request, *args, **kwargs)
return inner
return outer
#给全部请求方法添加装饰器
@method_decorator(outer,name='dispatch')
class Decorator(View):
def dispatch(self, request, *args, **kwargs):
# 使用super来进行继承
# super语法 :super().父类名()
return super().dispatch(request, *args, **kwargs)
def get(self, request):
return HttpResponse('get method')
def post(self, request):
return HttpResponse('post method')
# 为特定请求方法添加装饰器
@method_decorator(outer, name='get')
class Decorator(View):
def dispatch(self, request, *args, **kwargs):
# 使用super来进行继承
# super语法 :super().父类名()
return super().dispatch(request, *args, **kwargs)
def get(self, request):
return HttpResponse('get method')
def post(self, request):
return HttpResponse('post method')
如果需要给类视图的多个方法添加装饰器,但又不是所有的都添加,则可以直接在需要添加装饰器的方法上使用method_decorate(装饰器名称)即可
class Decorator(View):
def dispatch(self, request, *args, **kwargs):
# 使用super来进行继承
# super语法 :super().父类名()
return super().dispatch(request, *args, **kwargs)
@method_decorate(outer)
def get(self, request):
return HttpResponse('get method')
@method_decorator(outer)
def post(self, request):
return HttpResponse('post method')
中间件
-
在请求视图被处理前,中间件由上往下依次执行
-
在请求视图被处理后,中间件由下至上依次执行
示例:
定义两个中间件
def my_middleware(get_response):
print('init 被调用')
def middleware(request):
print('before request 被调用')
response = get_response(request)
print('after response 被调用')
return response
return middleware
def my_middleware2(get_response):
print('init2 被调用')
def middleware(request):
print('before request 2 被调用')
response = get_response(request)
print('after response 2 被调用')
return response
return middleware
注册添加两个中间件
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'users.middleware.my_middleware', # 添加
'users.middleware.my_middleware2', # 添加
]
执行结果
init2 被调用
init 被调用
before request 被调用
before request 2 被调用
view 视图被调用
after response 2 被调用
after response 被调用
模板
模板语句
1)for循环:
{% for item in 列表 %}
循环逻辑
{{forloop.counter}}表示当前是第几次循环,从1开始
{%empty%} 列表为空或不存在时执行此逻辑
{% endfor %}
2)if条件:
{% if ... %}
逻辑1
{% elif ... %}
逻辑2
{% else %}
逻辑3
{% endif %}
比较运算符如下:
==
!=
<
>
<=
>=
布尔运算符如下:
and
or
not
注意:运算符左右两侧不能紧挨变量或常量,必须有空格。
{% if a == 1 %} # 正确
{% if a==1 %} # 错误
自定义过滤器
-
在需要使用自定义过滤器的子应用中创建一个**
templatetags
**的包(包名固定),并创建一个.py文件,文件名随意 -
在文件中,输入以下命令
from django import template # 实例化注册对象 register = template.Library() #使用装饰器自定义过滤器 @register.filter # x表示要过滤参数 def add(x): return x+100
-
在要使用的HTML文件中使用**
{% load .py文件名 %}**
导入过滤器 -
注意-------templatetags文件夹需要在各自的子应用内创建
模板继承
-
目的-------提高代码复用性,减轻工作量
{% block 名称 %} 预留区域,可以编写默认内容,也可以没有默认内容 {% endblock 名称 %} {% extends "父模板路径"%} {% block 名称 %} 实际填充内容 {{ block.super }}用于获取父模板中block的内容 {% endblock 名称 %}
-
注释:
-单行注释
{#...#}
- 多行注释使用comment标签
{% comment %}
...
{% endcomment %}