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
在表单中提交文件
posted @ 2019-10-24 18:55  zmy泳  阅读(134)  评论(0编辑  收藏  举报