1. generic.View 视图类
重写get,post,put,delete,可以实现不同的请求方法的逻辑,
可以快速实现restful风格的接口开发
class IndexView(generic.View):
def get(self, *args, **kwargs):
pass
def post(self, *args, **kwargs):
pass
def put(self, *args, **kwargs):
pass
def delete(self, *args, **kwargs):
pass
from django.views import View
views文件中:
url.py 定义路由
另外:url.py 中,要这么写
后面加一个as_view()
path('rest/',views.ProjectsView.as_view())
————————————————
注:
这个是一个相同的路由,用一个视图类。
使用 View 类 de 项目举例:
因为有两个相同的路由,所以建了两个 视图类。
下面是不完成的代码,只是表达意思,具体的代码见
https://mp.csdn.net/mp_blog/creation/editor/130734106
视图中就写了两个类视图来实现
class CountryView(View):
# 获取所有的数据
def get(self, request):
# 方式1: 直接用数据库中的,字段名作为字段返回
county_querySetList=Country.objects.values("id","name")
county_list=list(county_querySetList)
# 方式2: 列表生成式,重写生成一个列表,可以新命名
county_list2 = [{"id":item.id,"country_name": item.name} for item in Country.objects.all()]
return JsonResponse(county_list2,safe=False) # safe 设置为False,可以转码
# 创建一条数据
def post(self, request):
# 0.用try处理 非 json字符串的情况
try:
body = json.loads(request.body) # 把json字符串 转成 字典(python中的数据类型)
c1=Country.objects.create(name=body["name"])
return JsonResponse({'id':c1.id,'msg':'创建成功'})
except Exception as e:
return JsonResponse({'msg':'参数有误'},status=400)
class CountryView2(View):
# 获取一条国家数据
def get(self,request,pk):
try: # 1.可以用try,处理 校验传递的pk 在数据库不存在的情况 等
c1 = Country.objects.get(id=pk)
except Exception as e:
return JsonResponse({'msg':'参数有误'},status=400)
return JsonResponse({'suscuce':True,"data":{"id":c1.id,"name":c1.name}})
# 修改一条数据
def put(self,request,pk):
try: # 1.可以用try,处理 校验传递的pk 在数据库不存在的情况 等
c1 = Country.objects.get(id=pk)
body = json.loads(request.body)
c1.name=body.get("newName")
c1.save()
except Exception as e:
return JsonResponse({'msg': '参数有误'}, status=400)
return JsonResponse({'suscuce': True, "data": {"id": c1.id, "name": c1.name},'msg':'更新成功'})
# 删除一条数据
def delete(self,request,pk): # 注意: 这个练习,要删除以一个没有学生的国家,因为设置时时保护型的。
try: # 1.可以用try,处理 校验传递的pk 在数据库不存在的情况 等
c1 = Country.objects.get(id=pk)
c1.delete()
except Exception as e:
return JsonResponse({'msg': '参数有误???'}, status=400)
return JsonResponse({'suscuce': True,'msg':'删除成功'},status=204)
-
- 查询所有数据,没有分页,没有过滤
- 请求参数未做校验,如果要校验会很麻烦,需要很多if 条件
- 没有认证授权功能
- 没有限流功能
- 5个接口无法放在同一个类视图中
为了解决这个问题,就要知道 django restframework
----------------------以下这个不常用- 前后端不分离用的(先不用管)-------------------------------:-
类视图相比函数视图,可以更快速的按模板来开发。
路由配置时,视图类后面要加上 as_view() #
1. generic.TemplateView功能渲染html文件,并传一些数据给页面。
源码:
一种方式是重写源码中的get_context_data 方法
from django.views import generic
class IndexView(generic.TemplateView):
template_name = "polls/index.html"
def get_context_data(self, **kwargs):
latest_question_list = Question.objects.order_by('-pub_date')[:5]
context = {
'latest_question_list': latest_question_list,
}
return context
另一种重写源码中的get方法
from django.views.generic import TemplateView
class IndexView(TemplateView):
template_name = "index.html"
def get(self, request, *args, **kwargs):
article_list = Article.objects.order_by("-create_time") # 文章要按时间来降序
context = {
"article_list": article_list,
}
return self.render_to_response(context)
只要按照这个格式写,就能实现功能
这个视图类和 如下 功能相同
-
return render(request, 'polls/results.html', {'question': question})