Django之视图层
Django之视图层
小白必会三板斧
HttpResponse
render
render推导式
from django.template import Template,Context
temp = Template("<h1> {{ user }} </h1>")
con = Context({"user":[1,2,3,4]})
res = temp.render(con)
return HttpResponse(res)
redict
JsonResponse
向前端返回一个json格式字符串的两种方式
方式一:
import json
def my_view(request):
data=['egon','kevin']
return HttpRespnse(json.dumps(data))
方式二:
from django.http import JsonResponse
def my_view(request):
data=['egon','kevin']
return JsonResponse(data,safe=False)
#默认safe=True代表只能序列化字典对象,safe=False代表可以序列化字典以外的对象
form表单上传文件
1.提交方式必须是post
2.需要将form标签的enctype属性由默认的urlencoded改为formdata
后端需要从request.FILES中获取上传的文件
django内部针对不同数据格式的数据 会解析到不同的方法中
request.GET
request.POST
request.FILES
FBV与CBV
django的视图层由两种形式结构:FBV和CBV
1、FBV基于函数的视图(function base view),我们之前一直介绍的都是FBV
2、CBV基于类的视图(class base view)
案例:
urls.py
from django.urls import path,register_converter,re_path
from app01 import views
urlpatterns=[
re_path(r'login/',views.LoginView.as_view()),
#必须调用类下的方法as_view
]
views.py
from django.shortcuts import render,HttpResponse,redirect
from django.views import View
class LoginView(View):
def dispatch(self, request, *args, **kwargs): # 可在该方法内做一些预处理操作
# 当请求url为:http://127.0.0.1:8008/login/会先触发dispatch的执行
# 如果http协议的请求方法为GET,则调用下述get方法
# 如果http协议的请求方法为POST,则调用下述post方法
obj=super().dispatch(request, *args, **kwargs) # 必须继承父类的dispatch功能
return obj # 必须返回obj
def get(self,request):
return render(request,'login.html')
def post(self,request):
name=request.POST.get('name')
pwd=request.POST.get('pwd')
if name == 'egon' and pwd == '123':
res='登录成功'
else:
res='用户名或密码错误'
return HttpResponse(res)
测试:
python manage.py runserver
在表单中提交文件