• Django进阶


    HTTP请求周期

    客户端发送请求(数据头)--》服务端接收提取URl--》路由关系匹配--》执行对应函数(模板+数据渲染)--》返回客户端(处理结果,数据头+数据体)

    一,路由分发                                                                   

    #from django.conf.urls import url,include
     url(r'^app01', include("app01.urls")),

    二,模板语言                                                                     

    #有后台传到前段的数据,
    
    #单值
    {% item %}
    
    #字典{"user":"钢弹"}
    {% item.user%}
    
    #多数据的时候可以遍历,需要加上结束语句endfor,if也要叫上结束语句endif
    
    {% for item in user_list %}
        {% if item %}        
            {{ item.id }}
         {% else %}
            {{ itme.name }}
        {% endif %}       
    {% endfor %}
    
    
    #----------母版 --------------#
    #所有模板共有的,把他们提取出来,放到一块
    
    #创建母版
    {% block 名字 %}
    
    {% endblock %}
    
    #子板继承母版
    
    {% extends "母版文件" %}
    
    {% block 母版定义的名字 %}
        可以写自己的内容
    {% endblock %}

    一般都是有三个母版文件,即css一个,内容一个,js一个

    {% block css %}
    #css    
    {% endblock %}
    
    {% block xx %}
    #内容
    {% endblock %}
    
    
    {% block js %}
    #js
    {% endblock %}

    三,AJAX                                                                            

    一般用于少量的输入框,数据少,登陆的时候,

    #新URL提交form表单是,页面对刷新
    
    
    #AJAX提交时页面不会刷新
    
    #AJAX是jQuery下的一个组件
    
    #AJAX格式
    $.ajax({
        url:"要提交的地址",
        type:"请求类型",  #GET或POST
        data:{"信息":提交信息},
        success:function(data){
                     //当服务器处理完后,自动执行的回调函数
                    //data是返回的数据,随便命名
        }    
    })
    
    #location.href = "要跳转的页面"
    #location.reload() #刷新当前页面
    
    js中自带JSON
    #JSON.stringify() //序列化字符串
    #JSON.parse(data); //反序列化字符串

    四,后台管理布局(Bootstrap,font-awesome)                         

    1,Bootstrap,来自 Twitter,是目前很受欢迎的前端框        架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT  的,它简洁灵活,使得 Web 开发更加快捷。

    2,Font Awesome提供可缩放的矢量图标,您可以使用CSS所提供的所有特性对它们进行更改,包括:大小、颜色、阴影或者其它任何支持的效果。

    五,Cookie                                                                      

    1,保存在客服端的“键值对”

    2,服务端可以向用户浏览器写Cookie

    3,客服端每次发送请求时,都会携带Cookie去访问

    4,Cookie一般应用于投票,用户登录

    1,html页面
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    <form method="post" action="/login/">
        用户名:<input type="text" name="username">
        密  码:<input type="password" name="password">
        <input type="submit" value="登录">
    
    </form>
    </body>
    </html>
    
    
    
    2,#路由关系对应执行函数
    
    def login(request):
    
        if request.method == "GET":
            return render(request,"login.html")
        else:
            user = request.POST.get("username")
            pwd = request.POST.get("password")
            if user == "alex" and pwd == "123":
                obj = redirect("/classes/")
                obj.set_cookie("ticket",user+pwd) #写cookie
                return obj
            else:
                return render(request,"login.html")
    
    3,登陆成功返回页面的执行函数
    
    def classes(request):
        tk = request.COOKIES.get("ticket") #获取cookie
        print(tk)
        if not tk:  
            return redirect("/login/")
        class_list = get_list("select * from class",[])
        return render(request,"classes.html",
                      {"class_list":class_list})
    用户登录

    六,ORM,                                                       

    ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法。

    2.ORM的优缺点是什么?

    优点:摆脱复杂的SQL操作,适应快速开发;让数据结构变得简洁;数据库迁移成本更低(如从mysql->oracle)

    缺点:性能较差、不适用于大型应用;复杂的SQL操作还需通过SQL语句实现

    from django.shortcuts import render,HttpResponse,redirect
    from django.views import View
    from app01 import models
    
    
    def test(request):
    
        #---------------增 -----------------------
    
        # for i in range(300):
        #     user_name = "root" + str(i)
        #     models.User.objects.create(name=user_name)
    
        # models.UserType.objects.create(type="普通用户")
        # models.UserType.objects.create(type="白银用户")
        # models.UserType.objects.create(type="黄金用户")
    
        # models.UserInfo.objects.create(name="张三1",age=12,ut_id=1)
        # models.UserInfo.objects.create(name="赵四2",age=12,ut_id=2)
        # models.UserInfo.objects.create(name="王五3",age=12,ut_id=3)
        # models.UserInfo.objects.create(name="王五3",age=12,ut_id=3)
        # models.UserInfo.objects.create(name="王五3",age=12,ut_id=3)
        # models.UserInfo.objects.create(name="王五3",age=12,ut_id=3)
        # models.UserInfo.objects.create(name="王五3",age=12,ut_id=3)
    
        # models.Foo.objects.create(title="钢弹")
        # models.Foo.objects.create(title="铁蛋")
        # models.UserType.objects.all().update(uf_id=1)
        #models.UserType.objects.filter(id=2).update(uf_id=2)
    
    #----------------查-------------------------#
        #对象跨表正向查询
        # result = models.UserInfo.objects.all()
        # for i in result:
        #     print(i.id,i.name,i.age,i.ut.type,i.ut.id)
    
        #三张表一块查
        # result = models.UserInfo.objects.all()
        # for i in result:
        #     print(i.id,i.name,i.age,i.ut.id,i.ut.type)
        #     print(i.ut.uf.id)
        #     print(i.ut.uf.title)
        #     print(i.ut_id)
    
    # ------------- 大于小于 -------
        # __gt  大于
        # result = models.UserInfo.objects.filter(id__gt=4).all()
        # for i in result:
        #     print(i.id,i.name,i.age)
    
        #__gte 大于等于
    
        # result = models.UserInfo.objects.filter(id__gte=2).all()
        # for i in result:
        #     print(i.id,i.name)
    
    
        # __lt 小于
        # result = models.UserInfo.objects.filter(id__lt=3).values("id","name")
        # print(result)
    
        # __lte 小于等于
    
        # result = models.UserInfo.objects.filter(id__lte=3).all()
        # for i in result:
        #     print(i.id,i.name)
    
        #a获取id大于2,并且小于10的数据,逗号隔开的是并且的意思
        # result = models.UserInfo.objects.filter(id__gt=2,id__lt=10)
        # for i in result:
        #     print(i.id,i.name)
    
    
        # 获取个数
    
        # result = models.UserInfo.objects.all().count()
        # print("数据行数:",result)
    
    
        # ----------- in 获取在列表内的
    
        # result  = models.UserInfo.objects.filter(id__in=[12,3,2,1,4,5,])
        # print(result)
        # for i in result:
        #     print(i.id,i.name)
    
    
        # ---------- not in 获取不在列表内的 exclude
        # result = models.UserInfo.objects.exclude(id__in=[12,3,2,1,4,5,])
        # for i in result:
        #     print(i.id,i.name)
    
    
        # -----  range 跟bettwen and  范围 1-10
        # result = models.UserInfo.objects.filter(id__range=[1,10])
        # for i in result:
        #     print(i.id,i.name,i.age)
    
        # ------ order_by  排序
        #  从小到大 asc
        # result = models.UserInfo.objects.order_by("id").all()
        # for i in result:
        #     print(i.id,i.name)
        #
        # #从大到小,desc 倒序 加个-
        # result1 = models.UserInfo.objects.order_by("-id")
        # for k in result1:
        #     print(k.id,k.name)
    
        # annotate 是 group by 分组
        # from django.db.models import Count,Max,Min
        #
        # result = models.UserInfo.objects.values("ut_id").annotate(xxx=Count("ut_id"))
        # print(result.query)
        # print(result)
        # for i in result:
        #     print("ut_id:%s,个数:%s"%(i["ut_id"],i["xxx"]))
    
    
        #字典格式 正向查询,无法跨表,
        # result = models.UserInfo.objects.all().values("id","name")
        # for i in result:
        #     print(i)
        #     print(i["id"],i["name"])
    
            #字典跨表
        # result = models.UserInfo.objects.all().values("id","name","ut__type")
        # for i in result:
        #     print(i)
        #     print(i["id"],i["name"],i["ut__type"])
    
        #元组格式,正向查询,无法跨表, 跨表需要在获取的时候添加上
        # result = models.UserInfo.objects.all().values_list("id","name","age")
        # for i in result:
        #     print(i)
        #     print(i[0],i[1],i[2])
    
            #元组跨表---- 外键名__ 双下换线列名
        # result = models.UserInfo.objects.all().values_list("id", "name", "age","ut__type")
        # for i in result:
        #     print(i[0],i[1],i[2],i[3])
    
    
    
      #-----------------反向查询------------------------#
    
        #------ 对象----------------
        # result = models.UserType.objects.all().last()
        # result1 = models.UserType.objects.all().first()
        # print(result)
        # print(result.id,result.type)
        # print(result1.id,result1.type)
        # for i in result.userinfo_set.all():
        #     print(i.name,i.age,i.id,)
    
    
        # -------------反向 小写表名__列名
        # result = models.UserType.objects.values("id","type","userinfo__name","userinfo__age","userinfo__id")
        # print(result)
        # for i in result:
        #     print(i)
    
        # result = models.UserType.objects.values("id","type","userinfo__name","userinfo__age")
        # print(result)
    
    #---------------------  F ----------------------------------
    
        from django.db.models import F,Q
    
        # # 批量增加
        # models.UserInfo.objects.update(age=F("age")+1)
    
    
    # ----------------Q 两种方式-----------------
    
        #方式一 :对象
    
        # conditions = {
        #     "id":1,
        #     "name":"root"
        # }
        #
        # ret = models.UserInfo.objects.filter(**conditions)
        # print(ret)
    
        #获取id大于1的数据
        # ret = models.UserInfo.objects.filter(Q(id__gt=1))
        # for i in ret:
        #     print(i.id,i.name)
    
        # 获取id=2 或者 id=4的数据
        # ret = models.UserInfo.objects.filter(Q(id=2) | Q(id=4))
        # for i in ret:
        #     print(i.id,i.name)
    
    
        #获取id=1并且age=13的数据
        # ret = models.UserInfo.objects.filter(Q(id=1) & Q(age=13))
        # for i in ret:
        #     print(i.id,i.name)
    
    
    
        # 方式2
        # q1 = Q()
        # q1.connector = "OR"
        # q1.children.append(("id__gt",1))
        # q1.children.append(("id",9))
        # q1.children.append(("id",10))
        # print(q1)
        #
        # q2 = Q()
        # q2.connector = "OR"
        # q2.children.append(("id",10))
        # q2.children.append(("id",2))
        # q2.children.append(("id",1))
        #
        # print(q2)
        #
        # con = Q()
        # con.add(q1,"AND")
        # con.add(q2,"AND")
        #
        # print(con)
        #
        # models.User.objects.filter(con)
    
    
    
    #  多对多 操作
        # objs = [
        #     models.Gril(name="小花"),
        #     models.Gril(name="小芳"),
        #     models.Gril(name="小草"),
        #     models.Gril(name="小小翠"),
        # ]
        #
        # obj = [
        #     models.Boy(name="张三"),
        #     models.Boy(name="赵四"),
        #     models.Boy(name="王五"),
        #     models.Boy(name="李六"),
        # ]
        # models.Gril.objects.bulk_create(objs,4)
        # models.Boy.objects.bulk_create(obj,5)
    
        # models.Love.objects.create(b_id=1,g_id=1)
        # models.Love.objects.create(b_id=1,g_id=2)
        # models.Love.objects.create(b_id=2,g_id=3)
        # models.Love.objects.create(b_id=2,g_id=2)
        # models.Love.objects.create(b_id=3,g_id=3)
        # models.Love.objects.create(b_id=4,g_id=4)
    
     # 跟张三有关系的女人
    
        #第一种
        # obj = models.Boy.objects.filter(name="张三").first()
        # love_list = obj.love_set.all()
        # print(love_list)
        # for i in love_list:
        #     print(i.g.name)
    
        #第二种
        # love_list = models.Love.objects.filter(b__name="赵四")
        # for i in love_list:
        #     print(i.g.name)
    
        #第三种
        # love_list = models.Love.objects.filter(b__name="王五").values("g__name")
        # for i in love_list:
        #     print(i)
        #     print(i["g__name"])
    
        #第四种
        # love_list1 = models.Love.objects.filter(b__name="李六").select_related("g","b")
        # print(love_list1)
        # for i in love_list1:
        #     print(i)
        #     print(i.g.name)
    
    
    #--------- django内置关系表 -----------------#
    
        #需要间接的去操作表
    
        #添加 add
        #obj = models.Gril.objects.filter(name="小小翠").first()
        #print(obj)
        # obj.m.add(1)
        # obj.m.add(*[1,2,3,4])#批量添加
    
        #删除 remove
        #obj.m.remove(1) #删除boy_id为1的数据
        # obj.m.remove(2,3) #还可以删多个
        #obj.m.remove(*[1,2,3]) #批量删除
    
        # 重写 set 清除表内原有数据,再把新的数据写进去
        # obj.m.set([1,2,])
    
    
        # ret = obj.m.all() # boy对象
        # print(ret)
        # for i in ret:
        #     print(obj.name,i.name)
    
    # -------- 自定义关系表 ------------
        # class Love(models.Model):
        #   #自定义关系表
        #     b = models.ForeignKey("Boy")
        #     g = models.ForeignKey("Gril")
    
    # ------ 内置和自定义一块用,指多了clear清空,和查询,其他的内置操作没有了
    
        # models.Love.objects.create(b_id=1,g_id=1)
        # models.Love.objects.create(b_id=1,g_id=2)
        # models.Love.objects.create(b_id=1,g_id=3)
        # models.Love.objects.create(b_id=2,g_id=1)
        # models.Love.objects.create(b_id=3,g_id=4)
        # models.Love.objects.create(b_id=4,g_id=2)
        #
        # obj = models.Boy.objects.filter(name="张三").first()
    
        #
    
        # ret = obj.m.all() #所有
        # for i in ret:
        #     print(i.name)
        # ret = obj.m.filter(name="钢弹") #条件查找
        # print(ret)
        #
        #清空,关联的所有数据
        #obj.m.clear()
    ORM操作

    七,Django的CBV,FBV                                           

    1,CBV(class based view),基于class类

    2,FBV(function based view),基于函数

    # FBV
    
    def index(request):
        return HttpResponse("hello world")
    
    
    #CBV
    
    from django.views import View
    #使用CBV时,需要继承View类 class Login(View): def get(self,request): return render(request,"login.html") def post(self,request): user_name = request.POST.get("user") print(user_name) return HttpResponse("login.post")

    八,表操作,Model                                               

    1,创建表

    # 基本表
    
    from django.db import models
    
    class Boy(models.Model):
        username = models.CharField(max_length=64)
        password = models.CharField(max_length=64)
    AutoField(Field)
            - int自增列,必须填入参数 primary_key=True
    
        BigAutoField(AutoField)
            - bigint自增列,必须填入参数 primary_key=True
    
            注:当model中如果没有自增列,则自动会创建一个列名为id的列
            from django.db import models
    
            class UserInfo(models.Model):
                # 自动创建一个列名为id的且为自增的整数列
                username = models.CharField(max_length=32)
    
            class Group(models.Model):
                # 自定义自增列
                nid = models.AutoField(primary_key=True)
                name = models.CharField(max_length=32)
    
        SmallIntegerField(IntegerField):
            - 小整数 -32768 ~ 32767
    
        PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
            - 正小整数 0 ~ 32767
        IntegerField(Field)
            - 整数列(有符号的) -2147483648 ~ 2147483647
    
        PositiveIntegerField(PositiveIntegerRelDbTypeMixin, IntegerField)
            - 正整数 0 ~ 2147483647
    
        BigIntegerField(IntegerField):
            - 长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
    
        自定义无符号整数字段
    
            class UnsignedIntegerField(models.IntegerField):
                def db_type(self, connection):
                    return 'integer UNSIGNED'
    
            PS: 返回值为字段在数据库中的属性,Django字段默认的值为:
                'AutoField': 'integer AUTO_INCREMENT',
                'BigAutoField': 'bigint AUTO_INCREMENT',
                'BinaryField': 'longblob',
                'BooleanField': 'bool',
                'CharField': 'varchar(%(max_length)s)',
                'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
                'DateField': 'date',
                'DateTimeField': 'datetime',
                'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
                'DurationField': 'bigint',
                'FileField': 'varchar(%(max_length)s)',
                'FilePathField': 'varchar(%(max_length)s)',
                'FloatField': 'double precision',
                'IntegerField': 'integer',
                'BigIntegerField': 'bigint',
                'IPAddressField': 'char(15)',
                'GenericIPAddressField': 'char(39)',
                'NullBooleanField': 'bool',
                'OneToOneField': 'integer',
                'PositiveIntegerField': 'integer UNSIGNED',
                'PositiveSmallIntegerField': 'smallint UNSIGNED',
                'SlugField': 'varchar(%(max_length)s)',
                'SmallIntegerField': 'smallint',
                'TextField': 'longtext',
                'TimeField': 'time',
                'UUIDField': 'char(32)',
    
        BooleanField(Field)
            - 布尔值类型
    
        NullBooleanField(Field):
            - 可以为空的布尔值
    
        CharField(Field)
            - 字符类型
            - 必须提供max_length参数, max_length表示字符长度
    
        TextField(Field)
            - 文本类型
    
        EmailField(CharField):
            - 字符串类型,Django Admin以及ModelForm中提供验证机制
    
        IPAddressField(Field)
            - 字符串类型,Django Admin以及ModelForm中提供验证 IPV4 机制
    
        GenericIPAddressField(Field)
            - 字符串类型,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6
            - 参数:
                protocol,用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
                unpack_ipv4, 如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both"
    
        URLField(CharField)
            - 字符串类型,Django Admin以及ModelForm中提供验证 URL
    
        SlugField(CharField)
            - 字符串类型,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号)
    
        CommaSeparatedIntegerField(CharField)
            - 字符串类型,格式必须为逗号分割的数字
    
        UUIDField(Field)
            - 字符串类型,Django Admin以及ModelForm中提供对UUID格式的验证
    
        FilePathField(Field)
            - 字符串,Django Admin以及ModelForm中提供读取文件夹下文件的功能
            - 参数:
                    path,                      文件夹路径
                    match=None,                正则匹配
                    recursive=False,           递归下面的文件夹
                    allow_files=True,          允许文件
                    allow_folders=False,       允许文件夹
    
        FileField(Field)
            - 字符串,路径保存在数据库,文件上传到指定目录
            - 参数:
                upload_to = ""      上传文件的保存路径
                storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
    
        ImageField(FileField)
            - 字符串,路径保存在数据库,文件上传到指定目录
            - 参数:
                upload_to = ""      上传文件的保存路径
                storage = None      存储组件,默认django.core.files.storage.FileSystemStorage
                width_field=None,   上传图片的高度保存的数据库字段名(字符串)
                height_field=None   上传图片的宽度保存的数据库字段名(字符串)
    
        DateTimeField(DateField)
            - 日期+时间格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]
    
        DateField(DateTimeCheckMixin, Field)
            - 日期格式      YYYY-MM-DD
    
        TimeField(DateTimeCheckMixin, Field)
            - 时间格式      HH:MM[:ss[.uuuuuu]]
    
        DurationField(Field)
            - 长整数,时间间隔,数据库中按照bigint存储,ORM中获取的值为datetime.timedelta类型
    
        FloatField(Field)
            - 浮点型
    
        DecimalField(Field)
            - 10进制小数
            - 参数:
                max_digits,小数总长度
                decimal_places,小数位长度
    
        BinaryField(Field)
            - 二进制类型
    字段
    null                数据库中字段是否可以为空
        db_column           数据库中字段的列名
        db_tablespace
        default             数据库中字段的默认值
        primary_key         数据库中字段是否为主键
        db_index            数据库中字段是否可以建立索引
        unique              数据库中字段是否可以建立唯一索引
        unique_for_date     数据库中字段【日期】部分是否可以建立唯一索引
        unique_for_month    数据库中字段【月】部分是否可以建立唯一索引
        unique_for_year     数据库中字段【年】部分是否可以建立唯一索引
    
        verbose_name        Admin中显示的字段名称
        blank               Admin中是否允许用户输入为空
        editable            Admin中是否可以编辑
        help_text           Admin中该字段的提示信息
        choices             Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
                            如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
    
        error_messages      自定义错误信息(字典类型),从而定制想要显示的错误信息;
                            字典健:null, blank, invalid, invalid_choice, unique, and unique_for_date
                            如:{'null': "不能为空.", 'invalid': '格式错误'}
    
        validators          自定义错误验证(列表类型),从而定制想要的验证规则
                            from django.core.validators import RegexValidator
                            from django.core.validators import EmailValidator,URLValidator,DecimalValidator,
                            MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
                            如:
                                test = models.CharField(
                                    max_length=32,
                                    error_messages={
                                        'c1': '优先错信息1',
                                        'c2': '优先错信息2',
                                        'c3': '优先错信息3',
                                    },
                                    validators=[
                                        RegexValidator(regex='root_d+', message='错误了', code='c1'),
                                        RegexValidator(regex='root_112233d+', message='又错误了', code='c2'),
                                        EmailValidator(message='又错误了', code='c3'), ]
                                )
    
    参数
    参数

     2,创建关联表

    from django.db import models
    
    class Boy(models.Model):
        username = models.CharField(max_length=64)
        password = models.CharField(max_length=64)
    
    class Girl(models.Model):
        username = models.CharField(max_length=64)
        password = models.CharField(max_length=64)
    
    class Boy_Girl(models.Model):
        b = models.ForeignKey("Boy")
        g = models.ForeignKey("Girl")

    3,

  • 相关阅读:
    easyui 获取分页栏中的行数(pageSize)和页码数(pageNumber)
    C# 跨盘符移动文件
    C# Json简单处理
    HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth之完全详解
    Jquery中的(function($){...})(jQuery)
    前端框架你究竟选什么
    Kindeditor使用心得
    jvm——内存模型
    jvm——NIO
    Java——静态类型 实际类型
  • 原文地址:https://www.cnblogs.com/gaoyuan111/p/7105855.html
Copyright © 2020-2023  润新知