django中视图的认识

一、定义视图的两种方式

  • 1、使用函数的方式定义

    from django.http import HttpResponse
    from django.shortcuts import render
    
    # Create your views here.
    
    def index(request):
        return HttpResponse('我的app2的主页')
    
  • 2、使用类的方式创建

    from django.views import View
    class Home(View):
        def get(self, request):
            return HttpResponse('我的使用类创建的')
    
        def post(self, request):
            pass
    
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('index/', views.index),
        path('home/', views.Home.as_view())
    ]
    

二、关于视图的返回值

  • 1、render(request, "模板")直接渲染模板(模板章节会介绍)
  • 2、HttpResponse(字符)直接返回字符串
  • 3、redirect(地址)重定向
  • 4、render_to_response("模板")render功能一样的
  • 5、render_to_string自行了解
  • 6、get_template自行了解

总结:

  • 1.在项目开发中常用的是renderredirect
  • 2.render底层的源码还是调用HttpResponse

    def render(request, template_name, context=None, content_type=None, status=None, using=None):
        """
        Return a HttpResponse whose content is filled with the result of calling
        django.template.loader.render_to_string() with the passed arguments.
        """
        content = loader.render_to_string(template_name, context, request, using=using)
        return HttpResponse(content, content_type, status)
    

三、判断请求方式

  • 1、使用函数方式创建的视图

    def index(request):
        if request.method == 'GET':
            return HttpResponse('我的app2的主页')
        elif request.method == 'POST':
            pass
    
  • 2、使用类的方式创建的视图

    其实使用类的方式创建,底层先调用dispatch函数

    from django.views import View
    
    class Home(View):
        def dispatch(self, request, *args, **kwargs):
            print(request.method)
            return super(Home, self).dispatch(request, *args, **kwargs)
    
        def get(self, request):
            return HttpResponse('我的使用类创建的')
    
        def post(self, request):
            pass
    

    关于dispatch的源码,其实就是通过反射来执行

    ...
    def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)
    ...
    

四、获取客户端的参数

  • 1、获取path参数

    def index1(request, id='0'):
        print(id)
        return HttpResponse(id)
    
  • 2、获取get请求的参数

    ...
    request.GET
    ...
    
  • 3、获取post请求的参数

    ...
    request.POST
    ...
    
  • 4、如果客户端传递的值是多个的话就要使用,常见复选框及多选下拉框

      ...
      request.POST.getlist()
      ...
    

五、视图分发

  • 1、前面我们介绍了url分发,其实视图也可以分发,这样就不会造成一个views.py文件很大,查找不方便
  • 2、在app下面新建一个views的包
  • 3、删除之前的views.py的文件
  • 4、使用的时候直接用views中导入视图文件

results matching ""

    No results matching ""