• Django关于视图层和模板层相关操作


    目  录

    前言:关于Django视图层和模板层相关理论知识梳理

        视图层
            小白必会三板斧
                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 模块名 %}
    View Code
  • 相关阅读:
    HTTP状态码
    firefox浏览器新建页面一直处于刷新状态解决方法
    firefox浏览器需要新建窗口时以新建标签页代替
    bash基础教程
    sqoop的导入|Hive|Hbase
    sqoop导出数据|Hive|HDFS和脚本编写
    sqoop安装
    sqoop简介和原理分析
    Oozie安装
    Oozie框架介绍
  • 原文地址:https://www.cnblogs.com/qinsungui921112/p/11735365.html
Copyright © 2020-2023  润新知