上下文管理器
view.py文件定义的方法,实际工作中会出现很多重复的代码,这个部分就可以使用上下文管理器来处理这些共用的内容
如下:博客首页index需要展示catagories文章分类和article文章,index和category方法中的catagories和article 变量 代码是相同的,这部分就可以使用上下文管理器优化
1 from django.shortcuts import render
2 from .models import Category,Article
3 # Create your views here.
4 def index(request):#首页
5 #数据来源数据库时,要引用到这个表的这个类
6 catagories = Category.objects.filter(is_delete=False)#获取所有数据
7 article = Article.objects.filter(is_delete=False)
8 data = {'nav':catagories,'articles':article}
9 return render(request,'index.html',data)#引用数据需要通过字典data引用
10
11 def category(request,id):#文章分类
12 catagories = Category.objects.filter(is_delete=False)#获取所有数据
13 article = Article.objects.filter(is_delete=False,category_id=id)
14 data = {'nav':catagories,'articles':article}
15 return render(request,'index.html',data)
写上下文管理步骤:
1.在应用user目录中定义文件名为process_content.py文件,文件名可自定义,路径也可以在其他路径下
2.编辑process_content.py文件,将共用的代码定义为方法,写在文件中
from . import models
def category_process(request):
# print('categroy_process....')调试用
categoies = models.Category.objects.filter(is_delete=False)
return {'nav':categoies}
3.settings.py文件 找到TEMPLATES -> OPTIONS ->context_processors,在后面追加上面步骤的文件路径
4.修改view.py中的代码
from django.shortcuts import render
from .models import Category,Article
# Create your views here.
def index(request):#首页
#数据来源数据库时,要引用到这个表的这个类
# catagories = Category.objects.filter(is_delete=False)#获取所有数据
article = Article.objects.filter(is_delete=False)
data = {'articles':article}
return render(request,'index.html',data)#引用数据需要通过字典data引用
def category(request,id):#文章分类
# catagories = Category.objects.filter(is_delete=False)#获取所有数据
article = Article.objects.filter(is_delete=False,category_id=id)
data = {'articles':article}
return render(request,'index.html',data)
上下文管理器原理:系统在调用view.py的方法后,会自动去setting.py中检索上文管理器,并将上下文管理中的方法返回值(返回的是字典),自动追加到view.py的data中(data 是render方法的第三个字典参数)