网站域名怎么看,一个网站如何做推广,长沙网站设计多少钱一个月,营销网站建设汉狮电话一、choices参数的使用
choices它是ORM中常用字段中的参数choices的作用#xff1a;类似于一些字段#xff1a;性别、学历、客户来源、是否上学、是否结婚等字段# 针对于一些字段它的情况能够被列举完#xff0c;像这样的字段#xff0c;我们在表中存储的时候一般使用choi…一、choices参数的使用
choices它是ORM中常用字段中的参数choices的作用类似于一些字段性别、学历、客户来源、是否上学、是否结婚等字段# 针对于一些字段它的情况能够被列举完像这样的字段我们在表中存储的时候一般使用choices参数
案例class Customer(models.Model):客户表qq models.CharField(verbose_nameqq, max_length64, uniqueTrue, help_textQQ号必须唯一)name models.CharField(verbose_name学生姓名, max_length16)gender_choices ((1, 男), (2, 女))gender models.SmallIntegerField(verbose_name性别, choicesgender_choices)education_choices ((1, 重点大学),(2, 普通本科),(3, 独立院校),(4, 民办本科),(5, 大专),(6, 民办专科),(7, 高中),(8, 其他))education models.IntegerField(verbose_name学历, choiceseducation_choices, blankTrue, nullTrue, )graduation_school models.CharField(verbose_name毕业学校, max_length64, blankTrue, nullTrue)major models.CharField(verbose_name所学专业, max_length64, blankTrue, nullTrue)experience_choices [(1, 在校生),(2, 应届毕业),(3, 半年以内),(4, 半年至一年),(5, 一年至三年),(6, 三年至五年),(7, 五年以上),]experience models.IntegerField(verbose_name工作经验, blankTrue, nullTrue, choicesexperience_choices)work_status_choices [(1, 在职),(2, 无业)]work_status models.IntegerField(verbose_name职业状态, choiceswork_status_choices, default1, blankTrue,nullTrue)company models.CharField(verbose_name目前就职公司, max_length64, blankTrue, nullTrue)salary models.CharField(verbose_name当前薪资, max_length64, blankTrue, nullTrue)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(客户来源, choicessource_choices, default1)referral_from models.ForeignKey(self,blankTrue,nullTrue,verbose_name转介绍自学员,help_text若此客户是转介绍自内部学员,请在此处选择内部学员姓名,related_nameinternal_referral)course models.ManyToManyField(verbose_name咨询课程, toCourse)status_choices [(1, 已报名),(2, 未报名)]status models.IntegerField(verbose_name状态,choicesstatus_choices,default2,help_textu选择客户此时的状态)consultant models.ForeignKey(verbose_name课程顾问, toUserInfo, related_nameconsultanter,limit_choices_to{depart: 1001})date models.DateField(verbose_name咨询日期, auto_now_addTrue)recv_date models.DateField(verbose_name当前课程顾问的接单日期, nullTrue)last_consult_date models.DateField(verbose_name最后跟进日期, )def __str__(self):return self.nameclass ConsultRecord(models.Model):客户跟进记录customer models.ForeignKey(verbose_name所咨询客户, toCustomer)consultant models.ForeignKey(verbose_name跟踪人, toUserInfo, limit_choices_to{depart: 1001})date models.DateField(verbose_name跟进日期, auto_now_addTrue)note models.TextField(verbose_name跟进内容...)def __str__(self):return self.customer.name : self.consultant.nameclass Student(models.Model):学生表已报名customer models.OneToOneField(verbose_name客户信息, toCustomer)class_list models.ManyToManyField(verbose_name已报班级, toClassList, blankTrue)emergency_contract models.CharField(max_length32, blankTrue, nullTrue, verbose_name紧急联系人)company models.CharField(verbose_name公司, max_length128, blankTrue, nullTrue)location models.CharField(max_length64, verbose_name所在区域, blankTrue, nullTrue)position models.CharField(verbose_name岗位, max_length64, blankTrue, nullTrue)salary models.IntegerField(verbose_name薪资, blankTrue, nullTrue)welfare models.CharField(verbose_name福利, max_length256, blankTrue, nullTrue)date models.DateField(verbose_name入职时间, help_text格式yyyy-mm-dd, blankTrue, nullTrue)memo models.CharField(verbose_name备注, max_length256, blankTrue, nullTrue)def __str__(self):return self.customer.nameclass ClassStudyRecord(models.Model):上课记录表 班级记录class_obj models.ForeignKey(verbose_name班级, toClassList)day_num models.IntegerField(verbose_name节次, help_textu此处填写第几节课或第几天课程...,必须为数字)teacher models.ForeignKey(verbose_name讲师, toUserInfo, limit_choices_to{depart: 1002})date models.DateField(verbose_name上课日期, auto_now_addTrue)course_title models.CharField(verbose_name本节课程标题, max_length64, blankTrue, nullTrue)course_memo models.TextField(verbose_name本节课程内容概要, blankTrue, nullTrue)has_homework models.BooleanField(defaultTrue, verbose_name本节有作业)homework_title models.CharField(verbose_name本节作业标题, max_length64, blankTrue, nullTrue)homework_memo models.TextField(verbose_name作业描述, max_length500, blankTrue, nullTrue)exam models.TextField(verbose_name踩分点, max_length300, blankTrue, nullTrue)def __str__(self):return {0} day{1}.format(self.class_obj, self.day_num)class StudentStudyRecord(models.Model):学生学习记录classstudyrecord models.ForeignKey(verbose_name第几天课程, toClassStudyRecord)student models.ForeignKey(verbose_name学员, toStudent)record_choices ((checked, 已签到),(vacate, 请假),(late, 迟到),(noshow, 缺勤),(leave_early, 早退),)record models.CharField(上课纪录, choicesrecord_choices, defaultchecked, max_length64)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(本节成绩, choicesscore_choices, default-1)homework_note models.CharField(verbose_name作业评语, max_length255, blankTrue, nullTrue)note models.CharField(verbose_name备注, max_length255, blankTrue, nullTrue)homework models.FileField(verbose_name作业文件, blankTrue, nullTrue, defaultNone)stu_memo models.TextField(verbose_name学员备注, blankTrue, nullTrue)date models.DateTimeField(verbose_name提交作业日期, auto_now_addTrue)def __str__(self):return {0}-{1}.format(self.classstudyrecord, self.student)-------------------------------------------------------------------------------
test中制作测试环境
import os
import sysif __name__ __main__:os.environ.setdefault(DJANGO_SETTINGS_MODULE, day61.settings)import djangodjango.setup()from app01 import models# 1.增加数据# models.UserInfo.objects.create(username张三, gender1)# models.UserInfo.objects.create(username李四, gender2)# models.UserInfo.objects.create(username王五, gender3)# models.UserInfo.objects.create(username赵六, gender4)# 2.读取数据# res models.UserInfo.objects.filter(pk1).first()# 如果使用get就得抛出否则获取不到数据会报错try:res models.UserInfo.objects.get(pk1)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_length64)# 全自动创建多对多的关系特点第三张表不需要我们自己来创建通过这个虚拟字段自动创建出来第三张表authors字段不会再表中创建出来字段那么以后你在查询的时候可以使用正反向查询和那四个方法 add set remove clear它的劣势就是表的扩展性很差# 若使用手动创建第三张表则这个authors就不需要了# authors models.ManyToManyField(toAuthor, throughBook2Author, through_fields(book,author))class Author(models.Model):name models.CharField(max_length128)through_fields的意思是指定第三张表中的哪些字段需要添加关系字段注意models.ManyToManyField 这句话写在作者表那么through_fields中的顺序就是先author再book反之就是先book再authorbooks models.ManyToManyField(toBook, throughBook2Author, through_fields(author,book))方式二全手动第三张表需要我们自己手动创建不会在自动创建了
优势扩展性非常好劣势不能使用四个方法 add set remove clear需要使用create、update、delete# class Book2Author(models.Model):
# book models.ForeignKey(toBook, on_deletemodels.CASCADE)
# author models.ForeignKey(toAuthor, on_deletemodels.CASCADE)
# create_time models.DateTimeField(auto_now_addTrue)方式三半自动:支持正反向查询的但是不支持那四个方法
class Book2Author(models.Model):book models.ForeignKey(toBook, on_deletemodels.CASCADE)author models.ForeignKey(toAuthor, on_deletemodels.CASCADE)create_time models.DateTimeField(auto_now_addTrue)
四、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 posttype:post,// 3. 指定要传递的数据data: {},//dataType:json, //指定序列化格式// 4. 回调函数接收后端返回的数据success:function (res) {}
})views.py中的代码
def index(request):# print(request.is_ajax()) # True Falseif 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 jsonres json.dumps(d, ensure_asciiFalse)若前端不想使用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 typetext idd1
input typetext idd2
input typetext idd3
button classbtn btn-info计算/button{# 绑定事件 #}
script$(.btn).click(function (){//获取两个输入框中的值var d1 $(#d1).val();var d2 $(#d2).val();//把前端输入的值提交到后端计算//问题是如何提交到后端//使用ajax提交$.ajax({// 1.指定参数提交到后端的哪个地址url: , // 如果不写就是朝当前地址提交// 2.指定以什么请求方式提交的 get post,如果不指定就是gettype: 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 属性中设置的默认值。