Django_视图层

Posted luodaoqi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

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

?
?
?
?
?
?

以上是关于Django_视图层的主要内容,如果未能解决你的问题,请参考以下文章

Django之模板层

Django -- 6.视图层

django-视图层

Django视图层之路由配置系统(urls)

Django视图层

Django的视图层