choices参数的使用、MTV和MVC的概念、对多的三种创建方式、Ajax技术

这篇具有很好参考价值的文章主要介绍了choices参数的使用、MTV和MVC的概念、对多的三种创建方式、Ajax技术。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、choices参数的使用

choices它是ORM中常用字段中的参数

choices的作用:
	类似于一些字段:性别、学历、客户来源、是否上学、是否结婚等字段

# 针对于一些字段它的情况能够被列举完,像这样的字段,我们在表中存储的时候一般使用choices参数
案例

class Customer(models.Model):
    """
    客户表
    """
    qq = models.CharField(verbose_name='qq', max_length=64, unique=True, help_text='QQ号必须唯一')

    name = models.CharField(verbose_name='学生姓名', max_length=16)
    gender_choices = ((1, '男'), (2, '女'))
    gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)

    education_choices = (
        (1, '重点大学'),
        (2, '普通本科'),
        (3, '独立院校'),
        (4, '民办本科'),
        (5, '大专'),
        (6, '民办专科'),
        (7, '高中'),
        (8, '其他')
    )
    education = models.IntegerField(verbose_name='学历', choices=education_choices, blank=True, null=True, )
    graduation_school = models.CharField(verbose_name='毕业学校', max_length=64, blank=True, null=True)
    major = models.CharField(verbose_name='所学专业', max_length=64, blank=True, null=True)

    experience_choices = [
        (1, '在校生'),
        (2, '应届毕业'),
        (3, '半年以内'),
        (4, '半年至一年'),
        (5, '一年至三年'),
        (6, '三年至五年'),
        (7, '五年以上'),
    ]
    experience = models.IntegerField(verbose_name='工作经验', blank=True, null=True, choices=experience_choices)
    work_status_choices = [
        (1, '在职'),
        (2, '无业')
    ]
    work_status = models.IntegerField(verbose_name="职业状态", choices=work_status_choices, default=1, blank=True,
                                      null=True)
    company = models.CharField(verbose_name="目前就职公司", max_length=64, blank=True, null=True)
    salary = models.CharField(verbose_name="当前薪资", max_length=64, blank=True, null=True)

    source_choices = [
        (1, "qq群"),
        (2, "内部转介绍"),
        (3, "官方网站"),
        (4, "百度推广"),
        (5, "360推广"),
        (6, "搜狗推广"),
        (7, "腾讯课堂"),
        (8, "广点通"),
        (9, "高校宣讲"),
        (10, "渠道代理"),
        (11, "51cto"),
        (12, "智汇推"),
        (13, "网盟"),
        (14, "DSP"),
        (15, "SEO"),
        (16, "其它"),
    ]
    source = models.SmallIntegerField('客户来源', choices=source_choices, default=1)
    referral_from = models.ForeignKey(
        'self',
        blank=True,
        null=True,
        verbose_name="转介绍自学员",
        help_text="若此客户是转介绍自内部学员,请在此处选择内部学员姓名",
        related_name="internal_referral"
    )
    course = models.ManyToManyField(verbose_name="咨询课程", to="Course")

    status_choices = [
        (1, "已报名"),
        (2, "未报名")
    ]
    status = models.IntegerField(
        verbose_name="状态",
        choices=status_choices,
        default=2,
        help_text=u"选择客户此时的状态"
    )

    consultant = models.ForeignKey(verbose_name="课程顾问", to='UserInfo', related_name='consultanter',
                                   limit_choices_to={'depart': 1001})

    date = models.DateField(verbose_name="咨询日期", auto_now_add=True)
    recv_date = models.DateField(verbose_name="当前课程顾问的接单日期", null=True)
    last_consult_date = models.DateField(verbose_name="最后跟进日期", )

    def __str__(self):
        return self.name


class ConsultRecord(models.Model):
    """
    客户跟进记录
    """
    customer = models.ForeignKey(verbose_name="所咨询客户", to='Customer')
    consultant = models.ForeignKey(verbose_name="跟踪人", to='UserInfo', limit_choices_to={'depart': 1001})
    date = models.DateField(verbose_name="跟进日期", auto_now_add=True)
    note = models.TextField(verbose_name="跟进内容...")

    def __str__(self):
        return self.customer.name + ":" + self.consultant.name


class Student(models.Model):
    """
    学生表(已报名)
    """
    customer = models.OneToOneField(verbose_name='客户信息', to='Customer')
    class_list = models.ManyToManyField(verbose_name="已报班级", to='ClassList', blank=True)

    emergency_contract = models.CharField(max_length=32, blank=True, null=True, verbose_name='紧急联系人')
    company = models.CharField(verbose_name='公司', max_length=128, blank=True, null=True)
    location = models.CharField(max_length=64, verbose_name='所在区域', blank=True, null=True)
    position = models.CharField(verbose_name='岗位', max_length=64, blank=True, null=True)
    salary = models.IntegerField(verbose_name='薪资', blank=True, null=True)
    welfare = models.CharField(verbose_name='福利', max_length=256, blank=True, null=True)
    date = models.DateField(verbose_name='入职时间', help_text='格式yyyy-mm-dd', blank=True, null=True)
    memo = models.CharField(verbose_name='备注', max_length=256, blank=True, null=True)

    def __str__(self):
        return self.customer.name


class ClassStudyRecord(models.Model):
    """
    上课记录表 (班级记录)
    """
    class_obj = models.ForeignKey(verbose_name="班级", to="ClassList")
    day_num = models.IntegerField(verbose_name="节次", help_text=u"此处填写第几节课或第几天课程...,必须为数字")
    teacher = models.ForeignKey(verbose_name="讲师", to='UserInfo', limit_choices_to={'depart': 1002})
    date = models.DateField(verbose_name="上课日期", auto_now_add=True)

    course_title = models.CharField(verbose_name='本节课程标题', max_length=64, blank=True, null=True)
    course_memo = models.TextField(verbose_name='本节课程内容概要', blank=True, null=True)
    has_homework = models.BooleanField(default=True, verbose_name="本节有作业")
    homework_title = models.CharField(verbose_name='本节作业标题', max_length=64, blank=True, null=True)
    homework_memo = models.TextField(verbose_name='作业描述', max_length=500, blank=True, null=True)
    exam = models.TextField(verbose_name='踩分点', max_length=300, blank=True, null=True)

    def __str__(self):
        return "{0} day{1}".format(self.class_obj, self.day_num)


class StudentStudyRecord(models.Model):
    '''
    学生学习记录
    '''
    classstudyrecord = models.ForeignKey(verbose_name="第几天课程", to="ClassStudyRecord")
    student = models.ForeignKey(verbose_name="学员", to='Student')

    record_choices = (('checked', "已签到"),
                      ('vacate', "请假"),
                      ('late', "迟到"),
                      ('noshow', "缺勤"),
                      ('leave_early', "早退"),
                      )
    record = models.CharField("上课纪录", choices=record_choices, default="checked", max_length=64)
    score_choices = ((100, 'A+'),
                     (90, 'A'),
                     (85, 'B+'),
                     (80, 'B'),
                     (70, 'B-'),
                     (60, 'C+'),
                     (50, 'C'),
                     (40, 'C-'),
                     (0, ' D'),
                     (-1, 'N/A'),
                     (-100, 'COPY'),
                     (-1000, 'FAIL'),
                     )
    score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
    homework_note = models.CharField(verbose_name='作业评语', max_length=255, blank=True, null=True)
    note = models.CharField(verbose_name="备注", max_length=255, blank=True, null=True)

    homework = models.FileField(verbose_name='作业文件', blank=True, null=True, default=None)
    stu_memo = models.TextField(verbose_name='学员备注', blank=True, null=True)
    date = models.DateTimeField(verbose_name='提交作业日期', auto_now_add=True)

    def __str__(self):
        return "{0}-{1}".format(self.classstudyrecord, self.student)


-------------------------------------------------------------------------------
test中制作测试环境
import os
import sys


if __name__ == '__main__':
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day61.settings')
    import django
    django.setup()
    from app01 import models

    # 1.增加数据
    # models.UserInfo.objects.create(username='张三', gender=1)
    # models.UserInfo.objects.create(username='李四', gender=2)
    # models.UserInfo.objects.create(username='王五', gender=3)
    # models.UserInfo.objects.create(username='赵六', gender=4)

    # 2.读取数据
    # res = models.UserInfo.objects.filter(pk=1).first()
    
    # 如果使用get就得抛出,否则获取不到数据会报错
    try:
        res = models.UserInfo.objects.get(pk=1)
        print(res)

        # 取值时不推荐使用这种
        # if res.gender == 1:
        #     gender = '男'
        # elif res.gender == 2:
        #     gender = '女'
        # else:
        #     gender = '未知'

        # 推荐使用
        print(res.get_gender_display())  # 男
    except Exception as e:
        print(e, '该数据不存在')

二、MTV和MVC的概念

把Django框架的执行流程做分层
	在Django中分的是MTV
	在其他语言中分的是MVC

# 这两个本质上都是一样的
Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,
Web服务器开发领域里著名的MTV模式,所谓MVC就是把Web应用分为模型(M),控制器(V)和视图(T)三层,

# Java、PHP文件名的命名是:
Login.Controller.java
Login.Controller.php

● M 代表模型(Model): 负责业务对象和数据库的关系映射(ORM)。
● T 代表模板 (Template):负责如何把页面展示给用户(html)。
● V 代表视图(View): 负责业务逻辑,并在适当时候调用Model和Template。
● S 代表视图(Services): 只有在业务逻辑相当复杂的时候,才分这一层,服务层,专门用来写业务逻辑

三、多对多的三种创建方式

多对多的关系是借助于第三张表实现的
	通过一个虚拟字段创建的第三张表:authors = models.ManyToManyField(to='') # 全自动的

多对多的创建方式
方式一:全自动
class Book(models.Model):
    title = models.CharField(max_length=64)
    # 全自动创建多对多的关系
    '''
        特点:第三张表不需要我们自己来创建,通过这个虚拟字段自动创建出来第三张表
             authors字段不会再表中创建出来字段
             那么以后你在查询的时候,可以使用正反向查询和那四个方法 add set remove clear
        它的劣势就是:表的扩展性很差
    '''
    # 若使用手动创建第三张表,则这个authors就不需要了
    # authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book','author'))


class Author(models.Model):
    name = models.CharField(max_length=128)
    '''
        through_fields的意思是指定第三张表中的哪些字段需要添加关系字段
        
        注意:models.ManyToManyField 这句话写在作者表,
            那么through_fields中的顺序就是先author再book,
            反之就是先book再author
    '''
    books = models.ManyToManyField(to='Book', through='Book2Author', through_fields=('author','book'))

方式二:全手动
	第三张表需要我们自己手动创建,不会在自动创建了
'''
    优势:扩展性非常好
    劣势:不能使用四个方法 add set remove clear
    需要使用create、update、delete
'''
# class Book2Author(models.Model):
#     book = models.ForeignKey(to='Book', on_delete=models.CASCADE)
#     author = models.ForeignKey(to='Author', on_delete=models.CASCADE)
#     create_time = models.DateTimeField(auto_now_add=True)


方式三:
	半自动:支持正反向查询的,但是不支持那四个方法
class Book2Author(models.Model):
    book = models.ForeignKey(to='Book', on_delete=models.CASCADE)
    author = models.ForeignKey(to='Author', on_delete=models.CASCADE)
    create_time = models.DateTimeField(auto_now_add=True)
    

四、Ajax技术简介

Ajax属于是前端的内容,不属于Python范围的,但是它必须结合后端来使用,否则也没有太大的意义,因为它是把前端的数据提交到后端的

form表单来提交数据到后端,但是,它每次提交数据都需要刷新页面,如果都刷新页面体验就不好
Ajax技术就是局部刷新,异步提交,它不需要刷新整个页面,只需要刷新局部的,主要就是刷新的时候是无感知的

Ajax的特点:
	局部刷新
	异步提交

案例:Github的注册案例

基于jquery的Ajax实现
# 我们知道Ajax它js是语言,所以它肯定能够使用js实现,但是,js实现太麻烦了,总共分四个步骤
# 我们不学学习js版本的ajax,我们学习jQuery封装之后的Ajax,把Ajax的使用表的非常简单

23种设计模式:单例模式,工厂模式,注册树模式等等

Ajax使用小案例

我们使用的ajax是jQuery封装之后的版本,所以,要想使用Ajax必须导入jQuery库

语法:
$.ajax({
	 // 1. 指定参数提交到后端的哪个地址?
     url:'',  // 如果不写就是朝当前地址提交
     
     // 2. 指定以什么请求方式提交的 get post
     type:'post',

     // 3. 指定要传递的数据
     data: {},
     //dataType:'json', //指定序列化格式
     
     // 4. 回调函数,接收后端返回的数据
     success:function (res) {}
})

                    
views.py中的代码:
def index(request):

    # print(request.is_ajax()) # True False
    if request.method == 'POST':
        # 接收参数
        # d1 = request.POST.get('d1')
        # d2 = request.POST.get('d2')
        #
        # # 做运算
        # d3 = int(d1) + int(d2)

        d = {'code': 200, 'msg': '请求方式', 'data': {'username': '老林'}}

        # return HttpResponse(d3)

        import json
        res = json.dumps(d, ensure_ascii=False)
        '''
            若前端不想使用JSON.parse(res),且后端还使用HttpResponse(res),
            则在前端加上 dataType: 'json' 指定json格式
        '''
        return HttpResponse(res)

        # '''
        #     如果后端使用了JsonResponse(d),则前端不需要JSON.parse(res)
        # '''
        # return JsonResponse(d)

    return render(request, 'index.html')

前端页面的代码:
<input type="text" id="d1">+
<input type="text" id="d2">=
<input type="text" id="d3">
<button class="btn btn-info">计算</button>


{# 绑定事件 #}
<script>
    $('.btn').click(function (){
        //获取两个输入框中的值
        var d1 = $("#d1").val();
        var d2 = $("#d2").val();

        //把前端输入的值提交到后端计算
        //问题是如何提交到后端
        //使用ajax提交
        $.ajax({
            // 1.指定参数提交到后端的哪个地址?
            url: '', // 如果不写就是朝当前地址提交

            // 2.指定以什么请求方式提交的  get  post,如果不指定就是get
            type: 'post',

            // 3.指定药传递的数据
            data: {d1: d1, d2: d2},
            {#data: {'d1': d1, 'd2': d2},#}

            dataType: 'json', {# 不使用 res = JSON.parse(res)序列化,但是还需要使用HttpResponse()时就使用这个指定格式 #}

            // 4.回调函数:接收后端返回的数据
            success: function (res){
                {#console.log(res);#}
                {#console.log(typeof res);#}
                {# 设置d3的value值 #}
                {#$('#d3').val(res)#}

                {# 前端怎么反序列化? #}
                {#res = JSON.parse(res)#}
                console.log(res)
                console.log(typeof res)
                console.log(res.code)
                console.log(res.data)
                console.log(res.data.username)
                console.log(res.msg)
        },

        })

    })
</script>
                
总结:
     1. 后端如果使用return JsonResponse(d), 前端不用反序列化,直接当成对象使用
     2. 后端使用return HttpResponse(res),前端需要自己反序列化:res= JSON.parse(res)
     3. 后端使用return HttpResponse(res),前端不反序列化,需要指定参数:dataType:'json'                  

name属性和value属性

name 属性:
	name 属性用于标识表单字段的名称,这个名称在提交表单时将作为数据的键名传递给服务器。
	每个表单字段(如输入框、复选框、单选按钮等)都应该有一个唯一的 name 属性。
	通过 name 属性,服务器端脚本或后端应用程序可以识别和获取相应的表单数据。
	在 HTML 表单中,表单字段的 name 属性通常结合服务器端代码来处理表单数据,例如 PHP、ASP.NET、Node.js 等。

value 属性:
	value 属性定义表单字段的初始值,或者在用户输入数据后,将包含用户输入的值。
	对于文本输入框、密码框、文本区域等,value 属性设置默认文本或用户已输入的文本。
	对于单选按钮和复选框,value 属性指定了该选项提交时传递给服务器的值。
	对于下拉菜单(<select> 元素),value 属性指定每个选项的值。
	用户在表单字段中输入的数据将会覆盖 value 属性中设置的默认值。


文章来源地址https://www.toymoban.com/news/detail-642773.html

到了这里,关于choices参数的使用、MTV和MVC的概念、对多的三种创建方式、Ajax技术的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 新手如何使用Spring MVC 中的查询字符串和查询参数

    目录 前言   什么是查询字符串和查询参数? Spring MVC中的查询参数  处理可选参数 处理多个值 处理查询参数的默认值 处理查询字符串 示例:创建一个RESTful服务  总结 作者简介:  懒大王敲代码,计算机专业应届生 今天给大家聊聊Java 新手如何使用Spring MVC 中的查询字符串

    2024年02月03日
    浏览(49)
  • Spring MVC参数接收、参数传递

    Springmvc中,接收页面提交的数据是通过方法形参来接收: 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型,所以spirngmvc提供了很多converter(转换器)在特殊情况下需要自定义converter,如对日期数据 编写controller  

    2024年01月16日
    浏览(59)
  • Spring MVC 参数接收

    Springmvc中,接收页面提交的数据是通过方法形参来接收: 处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参 springmvc接收的参数都是String类型,所以spirngmvc提供了很多converter(转换器)在特殊情况下需要自定义converter,如对日期数据 编写controller 在

    2024年01月23日
    浏览(45)
  • 【Spring MVC学习】连接 && 接收请求参数 && 响应返回参数

    目录 前言:认识Spring MVC 🌷1、什么是MVC? 一、建立连接(5个注解) 🌷1、@RequestMapping注解:注册接⼝的路由映射(默认返回页面) 🌷2、@ResponseBody注解:表示返回的是数据 🌷 3、组合注解@RestController = @ResponseBody + @Controller 🌷4、支持Get请求的2种写法@GetMapping + @RequestMapp

    2024年02月16日
    浏览(41)
  • Spring MVC 请求参数绑定

    Spring MVC 是一个用于构建 Web 应用程序的框架,它提供了一种方便的方式来处理 HTTP 请求和响应。在 Spring MVC 中,请求参数绑定是将 HTTP 请求中的参数映射到控制器方法的参数上的过程。Spring MVC 提供了多种方式来实现请求参数绑定。 请求参数绑定:说⽩了SpringMVC如何接收请求

    2024年02月07日
    浏览(41)
  • 【Java 高阶】一文精通 Spring MVC - 基础概念(一)

    👉 博主介绍 : 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区:个人社区 💞 个人主页:个人主页 🙉 专栏地址: ✅ Java 高阶 🙉八股文专题:剑指大厂,手撕

    2024年02月11日
    浏览(45)
  • Spring MVC各种参数进行封装

    目录 一、简单数据类型 1.1 控制器方法 1.2 测试结果 二、对象类型 2.1 单个对象 2.1.1 控制器方法 2.1.2 测试结果 2.2 关联对象 2.2.1 控制器方法 2.2.2 测试结果 三、集合类型 3.1 简单数据类型集合 3.1.1 控制方法 3.1.2 测试结果 3.2 对象数据类型集合 3.2.1 控制器方法 3.2.2 测试结

    2024年02月09日
    浏览(34)
  • Spring MVC: 请求参数的获取

    在 Spring MVC 介绍中,谈到前端控制器 DispatcherServlet 接收客户端请求,依据处理器映射 HandlerMapping 配置调用相应的处理器 Controller 。那么,处理器 Controller 具体是如何实现获取请求参数的呢?

    2024年02月10日
    浏览(44)
  • 3.5 Spring MVC参数传递

    Spring MVC的Controller接收请求参数的方式有多种,本节主要介绍Spring MVC下的HttpServletRequest、基本数据类型、Java Bean、数组、List、Map、JSON参数传递方式,同时解决POST请求中文乱码问题。 基本数据类型以及他们的包装类。 JSON格式采用键值对的方式来表示数据,由花括号 {} 包含对

    2024年02月13日
    浏览(44)
  • 案例13 Spring MVC参数传递案例

    基于Spring MVC实现HttpServletRequest、基本数据类型、Java Bean、数组、List、Map、JSON方式的参数传递。 选择Maven快速构建web项目,项目名称为case13-springmvc02。 ​ src.main路径下,执行new – Directory操作,选择java、resources后,执行回车键。 ​ 在web.xml中配置DispatcherServlet。 src.main.java.

    2024年02月13日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包