zoukankan      html  css  js  c++  java
  • 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 模块名 %}
    

    模型层
    ORM查询
    """
    如果你向查看orm语句内部真正的sql语句有两种方式
    1.如果是queryset对象 可以直接点query查看
    2.配置文件中 直接配置
    LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
    'console': {
    'level': 'DEBUG',
    'class': 'logging.StreamHandler',
    },
    },
    'loggers': {
    'django.db.backends': {
    'handlers': ['console'],
    'propagate': True,
    'level': 'DEBUG',
    },
    }}

        """
    
    只要是queryset对象就可以无限制的点queryset对象的方法
        queryset.filter().filter().filter()
    



    ​ django测试环境搭建
    ​ import os

        if __name__ == "__main__":
            os.environ.setdefault("DJANGO_SETTINGS_MODULE", "one_search.settings")
            import django
            django.setup()
            # 你就可以在下面测试django任何的py文件
    

    1.必知必会13条

    1. all() 查询所有的
    2.filter()  Queryset对象
    3.get() 数据对象本身
    4.first() 拿第一个
    5.last() 拿最后一个
    6.exclude()  除了传进去的参数 其他都要
    7.values  QuerySet对象   列表套字典
    8.values_list QuerySet对象  列表套元组
    9.count() 统计数据的个数
    10distinct()  去重
    11.reverse() 前面必须先经过排序才可以反转
    12.order_by() 排序 默认是升序   加负号就是降序
    13.exists() 判断数据是否存在
    
    

    2.神奇的双下划线查询

    __gt    大于
    __lt    小于
    __gte   大于或者等于
    __let		小于或者等于
    __in		是或者是
    __range	在什么之间
    __contatins	区分大小写
    __icontains	忽略大小写
    __startswith	以什么开头
    __endswith	以什么结尾
    __year	年份是几几年
    __month	月份是几月
    

    3.多对多字段的四个方法

    add() 括号内可以传数字也可以传数据对象,并且都支持传多个

    修改关系

    set() 括号内 既可以传数字也可以传对象 ,并且也可以传多个 但是需要注意的就是 括号内必须是一个可迭代对象

    删除

    remove() 括号内 可以传数字 也可以传对象 并且支持传多个

    清除

    clear() 括号内不需要传任何参数 直接情况当前对象的所有记录

    4.跨表查询的规律

    外键字段在哪 谁查谁 就是正向查询

    正向查询按字段

    ​ 当该字段所对应的数据有多个的时候,需要家.all()

    ​ 或者点外键字段直接就能够拿到数据对象

    反向查询按表名小写

    ​ 什么时候需要加_set

    ​ 当长袖的结果可以是多个的情况下 需要加_set.all()

    ​ 什么时候不需要加_set

    ​ 当查询的结果有且只有一个的情况下 不需要加任何东西 直接表名小写






  • 相关阅读:
    javascript实现图片的淡入淡出
    javascript实现(分享到xxx)的小实例
    javascript中奇怪事件
    javascript方式实现无缝滚动(两种方式)
    jquery 函数的3种用法
    jquery方法的隔行变色
    DOM对象与jquery对象
    入口函数的标准
    真数组与伪数组的区别
    创建正则表达式对象
  • 原文地址:https://www.cnblogs.com/luodaoqi/p/11750537.html
Copyright © 2011-2022 走看看