视图层

小白必会三板斧

        HttpResponse
        
        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)
        
        redirect
        
	
	JsonResponse
        返回一个json格式的字符串
        
        前后端分离
            后端给前端返回一个json的格式的字符串(大字典)
        
        
        1.可以自己手动json序列化
            import json
            class MyJsonEncode(json.JsonEncode):
                pass
            json.dumps(data,cls=MyJsonEncode,ensure_ascii=False)
            
        2.JsonResponse
            内部其实也是调了json.dumps
            JsonResponse(data,json_dumps_param={"ensure_ascii":False},safe=False)
            
	form表单上传文件
        1.提交方式必须是post
        2.需要将form标签的enctype属性由默认的urlencoded改为formdata
        
        后端需要从request.FILES中获取上传的文件
        
        django内部针对不同数据格式的数据 会解析到不同的方法中
            request.GET
            request.POST
            request.FILES
        
	
	FBV与CBV
        基于函数/类的视图
        
        CBV
        写视图函数 必须要写一个类 然后继续View
        from django.views import View
        class MyLogin(View):
            def get(self,request):
                return render(request,'login.html')
            
            def post(self,request):
                return HttpResponse('post请求')
        
        路由配置
        CBV源码
            FBV
                url(r'^index/',views.index)
            CBV
                url(r'^login/',views.MyLogin.as_view())
                # url(r'^login/',views.view)
        
        
            def as_view(cls,*args,**kwargs):
                def view(...):
                    self = cls(...)
                    
                    return self.dispatch(...)
                return view
            
            
            def dispatch(...):
                # 判断当前请求方式在不在八个默认的请求方式中 get post delete options ...
                # 利用反射 获取对象的所对应的属性或者是方法
                # 执行对应方法
	
	
django settings源码
    django暴露给用户一个自定义配置的文件 
    用户配置了就用用户的 用户没有配置就使用默认的  并且配置文件中的变量名必须是大写才有效
    from django.conf import settings
    
    settings = LazySettings()
    
    class LazySettings(object):
        ...
     
    class Settings(object):
        # 循环获取默认的配置文件中所有的大写配置
        # 利用setattr给对象不停的设置键值对
        # 再循环获取暴露给用户的自定义配置文件中所有的大写的配置
        # 再利用setattr给对象不停的设置键值对
        """字典的键存在的情况 再设值其实就是替换"""


模板层
    {{}}  变量相关
    {%%}  逻辑相关
    
	模板语法传值
        python基本数据类型
        函数名  # 传函数名 会自动加括号调用   不支持传参
        对象
        
        模板语法获取容器类型的数据  只能采用句点符(.)
            点索引
            点键
            
        
	
	模板语法之过滤器(|)
    
        会将|左边的值当作第一个参数传入 右边的当作第二个参数传入
        |add
        |default 
        |length
        |slice
        |truncatechars  # 截字符 三点也算
        |truncatewords  # 按空格截  三点不算
        |filesizeformat
        |safe
        
        
        前端
            |safe
        后端
            from django.utils.safestring import mark_safe
            
            res = mark_safe("<h1>111</h1>")
        """前端代码不一定必须要在前端写好  也可以再后端写完 传递给前端页面"""    
        只要思想不滑坡 方法总比困难多
        
        
	
	模板语法之标签
        {%%}
        if判断  后端语法一模一样
        for循环
            内部提供了一个forloop对象
                counter    # 1开始
                counter0  # 0开始
                first
                last
            empty  当for循环对象是个空的时候 就会走empty下面的逻辑
        
        with起别名  当一个数据是通过很复杂的方式获取到  好多地方有需要用
        
        keys,values,items
        
            
             
        
	自定义过滤器和标签
        1.在应用下新建一个名字必须叫templatetags文件夹
        2.在该文件夹下新建一个任何名称的py文件
        3.在该py文件中 先固定写两行代码
            from django.template import Library
            
            register = Library()
            
            @register.filter(name='过滤器的名字')
            def index(a,b):
                # 过滤器内部逻辑代码
                ...  # ...等价于pass
            
            @register.simple_tag(name='标签的名字')
            def login(a,b,c,*args):
                ...
                  
	
	模板的继承
        很多页面的大部分区域长的都差不多的情况下 你可以考虑使用模板的继承
            1,在你想用的那个页面上 通过block事先划定 你将来可能用得到的区域
                {% block 名字 %}
                    模板内容
                {% endblock %}
            2,子板需要先继承模板 才能用到该模板中 事先划定的区域
                {% extends 模板的名字 %}
                {% block 名字 %}
                    子板内容
                {% endblock %}
                
        一个模板页面通常应该有三个区域
                {% block css %}
                    
                {% endblock %}
                
                
                {% block content %}
                    
                {% endblock %}
                
                
                {% block js %}
                    
                {% endblock %}
                
                

	模板的导入
        通常情况下是将页面上的某一块区域当作一个模块
        {% include 模块名 %}
posted on 2019-10-24 16:49  黑糖A  阅读(98)  评论(0编辑  收藏  举报