一、choices參數(shù)的使用
choices它是ORM中常用字段中的參數(shù)
choices的作用:
類似于一些字段:性別、學歷、客戶來源、是否上學、是否結(jié)婚等字段
# 針對于一些字段它的情況能夠被列舉完,像這樣的字段,我們在表中存儲的時候一般使用choices參數(shù)
案例
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='畢業(yè)學校', max_length=64, blank=True, null=True)
major = models.CharField(verbose_name='所學專業(yè)', max_length=64, blank=True, null=True)
experience_choices = [
(1, '在校生'),
(2, '應(yīng)屆畢業(yè)'),
(3, '半年以內(nèi)'),
(4, '半年至一年'),
(5, '一年至三年'),
(6, '三年至五年'),
(7, '五年以上'),
]
experience = models.IntegerField(verbose_name='工作經(jīng)驗', blank=True, null=True, choices=experience_choices)
work_status_choices = [
(1, '在職'),
(2, '無業(yè)')
]
work_status = models.IntegerField(verbose_name="職業(yè)狀態(tài)", 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, "內(nèi)部轉(zhuǎn)介紹"),
(3, "官方網(wǎng)站"),
(4, "百度推廣"),
(5, "360推廣"),
(6, "搜狗推廣"),
(7, "騰訊課堂"),
(8, "廣點通"),
(9, "高校宣講"),
(10, "渠道代理"),
(11, "51cto"),
(12, "智匯推"),
(13, "網(wǎng)盟"),
(14, "DSP"),
(15, "SEO"),
(16, "其它"),
]
source = models.SmallIntegerField('客戶來源', choices=source_choices, default=1)
referral_from = models.ForeignKey(
'self',
blank=True,
null=True,
verbose_name="轉(zhuǎn)介紹自學員",
help_text="若此客戶是轉(zhuǎn)介紹自內(nèi)部學員,請在此處選擇內(nèi)部學員姓名",
related_name="internal_referral"
)
course = models.ManyToManyField(verbose_name="咨詢課程", to="Course")
status_choices = [
(1, "已報名"),
(2, "未報名")
]
status = models.IntegerField(
verbose_name="狀態(tài)",
choices=status_choices,
default=2,
help_text=u"選擇客戶此時的狀態(tài)"
)
consultant = models.ForeignKey(verbose_name="課程顧問", to='UserInfo', related_name='consultanter',
limit_choices_to={'depart': 1001})
date = models.DateField(verbose_name="咨詢?nèi)掌?, 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="跟進內(nèi)容...")
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='緊急聯(lián)系人')
company = models.CharField(verbose_name='公司', max_length=128, blank=True, null=True)
location = models.CharField(max_length=64, verbose_name='所在區(qū)域', 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='格式y(tǒng)yyy-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="節(jié)次", help_text=u"此處填寫第幾節(jié)課或第幾天課程...,必須為數(shù)字")
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='本節(jié)課程標題', max_length=64, blank=True, null=True)
course_memo = models.TextField(verbose_name='本節(jié)課程內(nèi)容概要', blank=True, null=True)
has_homework = models.BooleanField(default=True, verbose_name="本節(jié)有作業(yè)")
homework_title = models.CharField(verbose_name='本節(jié)作業(yè)標題', max_length=64, blank=True, null=True)
homework_memo = models.TextField(verbose_name='作業(yè)描述', 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("本節(jié)成績", choices=score_choices, default=-1)
homework_note = models.CharField(verbose_name='作業(yè)評語', max_length=255, blank=True, null=True)
note = models.CharField(verbose_name="備注", max_length=255, blank=True, null=True)
homework = models.FileField(verbose_name='作業(yè)文件', blank=True, null=True, default=None)
stu_memo = models.TextField(verbose_name='學員備注', blank=True, null=True)
date = models.DateTimeField(verbose_name='提交作業(yè)日期', auto_now_add=True)
def __str__(self):
return "{0}-{1}".format(self.classstudyrecord, self.student)
-------------------------------------------------------------------------------
test中制作測試環(huán)境
import os
import sys
if __name__ == '__main__':
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day61.settings')
import django
django.setup()
from app01 import models
# 1.增加數(shù)據(jù)
# 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.讀取數(shù)據(jù)
# res = models.UserInfo.objects.filter(pk=1).first()
# 如果使用get就得拋出,否則獲取不到數(shù)據(jù)會報錯
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, '該數(shù)據(jù)不存在')
二、MTV和MVC的概念
把Django框架的執(zhí)行流程做分層
在Django中分的是MTV
在其他語言中分的是MVC
# 這兩個本質(zhì)上都是一樣的
Web服務(wù)器開發(fā)領(lǐng)域里著名的MVC模式,所謂MVC就是把Web應(yīng)用分為模型(M),控制器(C)和視圖(V)三層,
Web服務(wù)器開發(fā)領(lǐng)域里著名的MTV模式,所謂MVC就是把Web應(yīng)用分為模型(M),控制器(V)和視圖(T)三層,
# Java、PHP文件名的命名是:
Login.Controller.java
Login.Controller.php
● M 代表模型(Model): 負責業(yè)務(wù)對象和數(shù)據(jù)庫的關(guān)系映射(ORM)。
● T 代表模板 (Template):負責如何把頁面展示給用戶(html)。
● V 代表視圖(View): 負責業(yè)務(wù)邏輯,并在適當時候調(diào)用Model和Template。
● S 代表視圖(Services): 只有在業(yè)務(wù)邏輯相當復(fù)雜的時候,才分這一層,服務(wù)層,專門用來寫業(yè)務(wù)邏輯
三、多對多的三種創(chuàng)建方式
多對多的關(guān)系是借助于第三張表實現(xiàn)的
通過一個虛擬字段創(chuàng)建的第三張表:authors = models.ManyToManyField(to='') # 全自動的
多對多的創(chuàng)建方式
方式一:全自動
class Book(models.Model):
title = models.CharField(max_length=64)
# 全自動創(chuàng)建多對多的關(guān)系
'''
特點:第三張表不需要我們自己來創(chuàng)建,通過這個虛擬字段自動創(chuàng)建出來第三張表
authors字段不會再表中創(chuàng)建出來字段
那么以后你在查詢的時候,可以使用正反向查詢和那四個方法 add set remove clear
它的劣勢就是:表的擴展性很差
'''
# 若使用手動創(chuàng)建第三張表,則這個authors就不需要了
# authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book','author'))
class Author(models.Model):
name = models.CharField(max_length=128)
'''
through_fields的意思是指定第三張表中的哪些字段需要添加關(guān)系字段
注意:models.ManyToManyField 這句話寫在作者表,
那么through_fields中的順序就是先author再book,
反之就是先book再author
'''
books = models.ManyToManyField(to='Book', through='Book2Author', through_fields=('author','book'))
方式二:全手動
第三張表需要我們自己手動創(chuàng)建,不會在自動創(chuàng)建了
'''
優(yōu)勢:擴展性非常好
劣勢:不能使用四個方法 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技術(shù)簡介
Ajax屬于是前端的內(nèi)容,不屬于Python范圍的,但是它必須結(jié)合后端來使用,否則也沒有太大的意義,因為它是把前端的數(shù)據(jù)提交到后端的
form表單來提交數(shù)據(jù)到后端,但是,它每次提交數(shù)據(jù)都需要刷新頁面,如果都刷新頁面體驗就不好
Ajax技術(shù)就是局部刷新,異步提交,它不需要刷新整個頁面,只需要刷新局部的,主要就是刷新的時候是無感知的
Ajax的特點:
局部刷新
異步提交
案例:Github的注冊案例
基于jquery的Ajax實現(xiàn)
# 我們知道Ajax它js是語言,所以它肯定能夠使用js實現(xiàn),但是,js實現(xiàn)太麻煩了,總共分四個步驟
# 我們不學學習js版本的ajax,我們學習jQuery封裝之后的Ajax,把Ajax的使用表的非常簡單
23種設(shè)計模式:單例模式,工廠模式,注冊樹模式等等
Ajax使用小案例
我們使用的ajax是jQuery封裝之后的版本,所以,要想使用Ajax必須導(dǎo)入jQuery庫
語法:
$.ajax({
// 1. 指定參數(shù)提交到后端的哪個地址?
url:'', // 如果不寫就是朝當前地址提交
// 2. 指定以什么請求方式提交的 get post
type:'post',
// 3. 指定要傳遞的數(shù)據(jù)
data: {},
//dataType:'json', //指定序列化格式
// 4. 回調(diào)函數(shù),接收后端返回的數(shù)據(jù)
success:function (res) {}
})
views.py中的代碼:
def index(request):
# print(request.is_ajax()) # True False
if request.method == 'POST':
# 接收參數(shù)
# 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.指定參數(shù)提交到后端的哪個地址?
url: '', // 如果不寫就是朝當前地址提交
// 2.指定以什么請求方式提交的 get post,如果不指定就是get
type: 'post',
// 3.指定藥傳遞的數(shù)據(jù)
data: {d1: d1, d2: d2},
{#data: {'d1': d1, 'd2': d2},#}
dataType: 'json', {# 不使用 res = JSON.parse(res)序列化,但是還需要使用HttpResponse()時就使用這個指定格式 #}
// 4.回調(diào)函數(shù):接收后端返回的數(shù)據(jù)
success: function (res){
{#console.log(res);#}
{#console.log(typeof res);#}
{# 設(shè)置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>
總結(jié):
1. 后端如果使用return JsonResponse(d), 前端不用反序列化,直接當成對象使用
2. 后端使用return HttpResponse(res),前端需要自己反序列化:res= JSON.parse(res)
3. 后端使用return HttpResponse(res),前端不反序列化,需要指定參數(shù):dataType:'json'
name屬性和value屬性
name 屬性:
name 屬性用于標識表單字段的名稱,這個名稱在提交表單時將作為數(shù)據(jù)的鍵名傳遞給服務(wù)器。
每個表單字段(如輸入框、復(fù)選框、單選按鈕等)都應(yīng)該有一個唯一的 name 屬性。
通過 name 屬性,服務(wù)器端腳本或后端應(yīng)用程序可以識別和獲取相應(yīng)的表單數(shù)據(jù)。
在 HTML 表單中,表單字段的 name 屬性通常結(jié)合服務(wù)器端代碼來處理表單數(shù)據(jù),例如 PHP、ASP.NET、Node.js 等。
value 屬性:
value 屬性定義表單字段的初始值,或者在用戶輸入數(shù)據(jù)后,將包含用戶輸入的值。
對于文本輸入框、密碼框、文本區(qū)域等,value 屬性設(shè)置默認文本或用戶已輸入的文本。
對于單選按鈕和復(fù)選框,value 屬性指定了該選項提交時傳遞給服務(wù)器的值。
對于下拉菜單(<select> 元素),value 屬性指定每個選項的值。
用戶在表單字段中輸入的數(shù)據(jù)將會覆蓋 value 屬性中設(shè)置的默認值。
文章來源地址http://www.zghlxwxcb.cn/news/detail-642773.html
文章來源:http://www.zghlxwxcb.cn/news/detail-642773.html
到了這里,關(guān)于choices參數(shù)的使用、MTV和MVC的概念、對多的三種創(chuàng)建方式、Ajax技術(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!