zoukankan      html  css  js  c++  java
  • day66——choices参数、MTV/MVC模型、三种创建多对多的方式、AJAX

    redirect补充:

    redirect括号里可以直接写url,还可以写url的别名,它会自动进行反向解析然后帮你跳转。但是如何url是有名分组或者是无名分组的情况,别名需要额外的参数redirect则无法实现,还是得使用reverse进行反向解析。

    choices参数

    针对某个可以列举完全可能性的字段,一般会采用choices参数来存储;通过存数字或者字母、简单的单词来对应数据的详细解释;比如客户表中的表示性别字段(男/女),或者是成绩表的成绩(优良中差)。

    class User(request):
        username = models.CharField(max_length=32)
        # 用元组列举完客户性别的可能性,元组内第一个参数是字段的的值,第二个参数是对应的解释/内容。
        gender_choices = (
            (1,'男'),
            (2,'女'),
        )
        # 创建字段时字段的类型取决于元组内第一个参数的数据类型
        gender = models.IntegerField(choices = gender_choices)  # 整型字段
        
        
    class Student(models.Model):
        name = models.CharField(max_length=32)
        score_choices =(
            ('A', '优秀'),
            ('B', '良好'),
            ('C', '中等'),
            ('D', '不及格'),
        )
        score = models.CharField(max_length=32, choices=score_choices)  # 字符字段,字段该传的参数还的传
    
    

    指定choice参数的字段存数据的范围还是取决于字段本身的类型,就是说不管有没有在元组里列举出来,只要数据的类型相同且在字段的最大限制范围内都是可以存储的,只不过存元组列举范围内的数据可以非常轻松的获取到数字/字母对应真正的内容。choice字段取值固定句式.get_字段名_display()

    # 存数据
    models.User.objects.create(username='jason',gender=1)
    models.User.objects.create(username='egon',gender=2)
    models.User.objects.create(username='tank',gender=3)  # 不再元组列举的范围内也能存储
    """
      gender
        1
        2
        3
    """
    
    # 取值
    user_obj1=models.User.objects.filter(pk=1).first()
    user_obj2=models.User.objects.filter(pk=3).first()
    print(user_obj1.get_gender_display())  # 男   在元组的列举范围内取具体的内容
    print(user_obj2.get_gender_display())  # 3    在元组的列举范围内取原本存入的数据
    
    

    choices参数的使用场景非常广泛。

    # 学历
    education_choices = (
            (1, '重点大学'),
            (2, '普通本科'),
            (3, '独立院校'),
            (4, '民办本科'),
            (5, '大专'),
            (6, '民办专科'),
            (7, '高中'),
            (8, '其他')
    )
    
    # 工作经验
    experience_choices = [
            (1, '在校生'),
            (2, '应届毕业'),
            (3, '半年以内'),
            (4, '半年至一年'),
            (5, '一年至三年'),
            (6, '三年至五年'),
            (7, '五年以上'),
    ]
    

    MTV与MVC模型

    • MTV:Django号称是MTV模型,其实本质上也是MVC模型

      • M:models
      • T:templates
      • V:views
    • MVC: 设计模型是一种使用 Model View Controller( 模型-视图-控制器)设计创建 Web 应用程序的模式。

    多对多三种创建方式

    1. 纯手动

      自己创建第三张关系表,在关系表中书写外键字段(基本不用)

      class Book(models.Model):
          title = models.CharField(max_length=32)
          
          
      class Author(models.Model):
      	name = models.CharField(max_length=32)
      
      
      class Book2Author(models.Model):  # 手动建关系表
          book_id = models.ForeignKey(to='Book')  # 关系表中自己建外键字段
          author_id = models.ForeignKey(to='Author')
          related_time = models.DateField(auto_now=True) # 扩展字段
      

      优点:

      第三张关系表可以根据自己的需求进行额外的扩展,比如增加一个两表关系的更新时间

      缺点:

      需要书写的代码较多,且不能使用orm提供的简单的方法,使用起来非常麻烦。

    2. 全自动

      无需直接建关系表,让orm自动帮助我们创建。

      class Book(models.Model):
          title = models.CharField(max_length=32)
          authors = models.ManyToManyField(to='Author')  # 虚拟的外键字段,告诉orm创建关系表
          
          
      class Author(models.Model):
      	name = models.CharField(max_length=32)
      

      优点:

      关系表不用自己创建,且支持orm提供操作第三张关系表的方法,使用起来非常方便

      缺点:

      第三张关系表的扩展性极差(无法增加额外的字段)

    3. 半自动

      需要建关系表提升扩展性,并且还可以在基表内建外键。

      class Book(models.Model):
          title = models.CharField(max_length=32)
          authors = models.ManyToManyField(to='Author',
                                          through='Book2Author',
                                          through_fileds=('book','author'))  # 告诉orm通过哪张表建立关系 
          
          
      class Author(models.Model):
      	name = models.CharField(max_length=32)
           
              
      class BookAuthor(models.Model):
          book = models.ForeignKey(to='Book')
          author = models.ForeignKey(to='Author')
      

      优点:

      扩展高并且能够使用orm操作第三张表的方法,支持正反向查询。

      缺点:

      add,set,remove,clear这四个方法不能使用。

      through_fileds字段参数的先后顺序:

      • 判断的本质:通过第三张关系表查询对应的表,需要用哪个字段就把哪个字段放在前面

      • 简化判断:当前表是谁,就把对应的关键字放在前面

    AJAX

    Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),AJAX并不是一门新的编程语言,而是一种使用现有标注的新方法(跟装饰器类似)。它能够向后端提供GET请求/POST请求,提交异步请求,实现局部更新的效果。

    效果可参照github的登录界面,实时显示用户名是否也存在或者是否合法。

    github的注册界面

    优点:

    在不重新加载页面的情况下,可以跟服务器进行数据的交互并更新部分页面内容,这一特点给用户的感受是在不知不觉中完成请求和响应过程。

    jax我们只学习jQuery封装之后的版本,简单一点,所以在使用AJAX前,确保了JQuery,

    并不只有jQuery能够实现ajax,其他的框架也可以 但是换汤不换药 原理是一样的。

    AJAX基本语法

    $.ajax({
        url:'',  # 指定提交的后端地址
        type:'post',  # 提交请求方式址
        data:,  # 提交的数据
        success:function(args){  # 4.回调函数:当后端给你返回结果的时候会自动触发 args接受后端的返回结果
            alert('111')
        }
    })
    

    小例子

    前两个input输入数字点击求和按钮,页面不刷新的情况下,在第三个框展示结果,健壮性先不考虑,体会AJAX的特性

    路由:

    url(r'^simple_sum/',views.simple_sum,name='simple_sum')

    后端:

    def simple_sum(request):
        import json
        if request.method=='POST':
            i1=request.POST.get('i1')
            i2=request.POST.get('i2')
            i3 = int(i1)+int(i2)
            return HttpResponse(i3)
        return render(request,'simple_sum.html')
    

    前端页面:

    <body>
    <div class="container">
        <div class="row">
            <input type="text" id="d1" name="i1">+
            <input type="text" id="d2" name="i2">=
            <input type="text" id="d3">
            <button class="btn btn-success">求和</button>
        </div>
    </div>
    <script>
        $('.btn').click(function () {
            $.ajax({
                url:'',
                data: {'i1':$('#d1').val(),'i2':$('#d2').val()},
                type:'post',
                dataType:'json',
                success:function (args) {
                    $('#d3').val(args)
                }
            })
        })
    </script>
    </body>
    

    回调函数的是否自动序列化

    • 针对后端如果是用HttpResponse返回的数据,回调函数不会自动帮你反序列化

      解决办法:

      • 自己在前端利用JSON.parse()
      • 在ajax里面配置一个参数,dataType:'json'
    • 如果后端直接用的是JsonResponse返回的数据,回调函数会自动帮你反序列化

  • 相关阅读:
    JavaScript 金字塔
    最短路径—Dijkstra算法和Floyd算法
    Qt编程的一些技巧
    Qt-Creator 加入qwt库
    关于usr/bin/ld: cannot find -lxxx问题总结(Qt编译错误cannot find -lGL)
    根文件系统制作、NFS配置与安装及利用NFS挂载根文件系统
    tslib1.4与Qt4.8.6的交叉编译与移植
    用树莓派做3G无线路由器
    python学习笔记6:面向对象
    pyhton学习笔记5:常用模块:datatime,random,json,re
  • 原文地址:https://www.cnblogs.com/zhangtieshan/p/13039688.html
Copyright © 2011-2022 走看看