昨日內容回顧
1.choices參數
class Userinfo(models.Model):
username = ...
age = ...
gender_choice = (
(1,'male'),
(2,'female'),
(3,'others'),
)
gender = models.IntegerField(choices=gender_choice)
# gender存的是數字 若是數字在上面的對應關係中 那麼在取值的時候 能夠經過
user_obj.gender # 數字
user_obj.get_gender_display() # 取到的就是數字對應的解釋
# 若是存的數字不在範圍內 拿到的仍是數字自己
2.MTV與MVC模型
MTV:
M:models
T:templates
V:views
MVC:
M:models
V:views
C:controller
本質:MTV其實也是MVC
3.ajax(******)
異步提交
局部刷新
咱們所學的ajax是基於jQuery封裝好簡易版本
因此你在寫ajax的時候必定要確保導入可jQuery
1.本身寫一個計算功能
2.ajax基本語法結構
$.ajax({
url:'', # 指定朝哪一個後端地址發送請求 不寫默認朝當前地址提交
type:'post', # 指定提交方式
data:{'username':'jason','password':'123'},
success:function(data){ # data指代的就是後端返回的異步提交的結果
# 異步回調機制邏輯處理代碼
}
})
4.先後端傳輸數據的編碼格式
編碼格式種類
1.urlencoded
2.formdata
3.application/json
form表單
form表單默認的編碼格式是urlencoded
urlencoded編碼格式的數據特色
username=jason&password=123&age=18
# django後端針對符合urlencoded數據格式 會自動解析 並給你封裝到request.POST中
# 你能夠經過制定enctype參數來修改form表單提交數據的編碼格式
# form表單傳輸文件的時候 編碼格式就必須有默認的改成formdata
"""
便可以傳普通的鍵值對也能夠上傳文件
django後端針對只要是符合urlencoded格式的數據都會自動解析放到request.POST
針對文件數據 會解析並放到request.FILES
"""
ajax 默認的數據編碼格式也是urlencoded
也就意味着ajax發送post請求django後端默認也是經過request.POST獲取數據
ajax發送json格式數據
如何查看前端提交數據的編碼格式?
在請求頭中有一個content-Type參數
"""
先後端交互數據的時候 必定要作到數據個編碼格式的一致性
"""
1.須要手動指定編碼格式
contentType:'application/json'
2.必定要確保數據也是符合json格式的
data:JSON.stringify({'username':'jason'})
# django後端針對json格式的數據 是不會作任何處理的 會原封不動的放在request.body中
你能夠手動去處理獲取數據
1.將bytes類型轉成json格式字符串
2.利用json模塊json.loads反序列化出來
ajax傳輸文件
ajax傳文件 須要使用到js內置對象 FormData
該對象及能夠攜帶普通的鍵值對 給django後端的request.POST也能夠攜帶文件給django後端的request.FILES
# 1.現生成一個formdata對象
var MyFormData = new FormData();
# 2.添加普通的鍵值對
MyFormData.append('username','jason');
MyFormData.append('password','123');
# 3.添加文件
var fileObj = $('#myfile')[0].files[0];
MyFormData.append('myfile',fileObj)
"""
如何獲取type=file的input標籤存儲的用戶上傳文件
"""
$.ajax({
url:'',
type:'post',
data:MyFormData,
# 須要手動指定兩個關鍵性的參數
contentType:false,
processData:false,
success:function(data){
...
}
})
序列化組件
from django.core imprt seralizers
user_queryset = models.Userinfo.objects.all()
res = seralizers.Seralizer('json',user_queryset)
"""
res = [{},{},{}]
"""
return HttpResponse(res)
ajax + sweetalert
今日內容
批量插入數據
bulk_create
# 1.往書籍表中插入數據 1000
# for i in range(1000): # 這種插入方式 效率極低
# models.Book.objects.create(title='第%s本書'%i)
book_list = []
for i in range(100000): # 時間仍是很短 二者差距很大
book_list.append(models.Book(title='第%s本書'%i))
models.Book.objects.bulk_create(book_list) # 批量插入數據
# 2.將剛剛插入的數據查詢出來展現到前端
book_queryset = models.Book.objects.all()
return render(request,'index.html',locals())
自定義分頁器
重點在於推到思路 代碼你能夠不掌握
自定義分頁器的使用 新建一個py文件將代碼直接拷貝過去
後端
from app01.utils.mypage import Pagination
# 使用封裝好的分頁器代碼
def login(request):
book_queryset = models.Book.objects.all()
current_page = request.GET.get('page',1)
all_count = book_queryset.count()
# 1.實例化產生對象
page_obj = Pagination(current_page=current_page,all_count=all_count)
# 2.對真實數據進行切片操做
page_queryset = book_queryset[page_obj.start:page_obj.end]
return render(request,'login.html',locals())
前端
{% for book_obj in page_queryset %}
html
{{ book_obj.title }}前端
三種渲染前端頁面的方式ajax
第一種渲染前端頁面的方式:封裝程度過高了 標籤樣式及參數不方便調整 可擴展性差(不推薦使用)
{{ form_obj.as_p }}
{{ form_obj.as_ul }}
django
第二種渲染頁面的方式:擴展性較高 不足之處在於 須要你手寫的代碼量比較多(不推薦使用)json
{{ form_obj.username.label }}{{ form_obj.username }}
後端
{{ form_obj.password.label }}{{ form_obj.password }}
app
{{ form_obj.email.label }}{{ form_obj.email }}
異步
第三種渲染前端頁面的方式:代碼量和擴展性都很高(推薦使用)函數
{{ foo.label }}{{ foo }}post
局部鉤子 # 當你須要對某一個字段數據進行額外的一些列校驗 你能夠考慮使用鉤子函數 # 針對單個字段的 使用局部鉤子 def clean_username(self): username = self.cleaned_data.get('username') if '水滸傳' in username: # 給username字段下面提示錯誤信息 self.add_error('username','用戶名不符合社會主義核心價值觀') return username 全局鉤子 # 針對多個字段的校驗 使用全局鉤子 eg:校驗兩次密碼是否一致 def clean(self): password = self.cleaned_data.get('password') confirm_password = self.cleaned_data.get('confirm_password') if not password == confirm_password: self.add_error('confirm_password','兩次密碼不一致') return self.cleaned_data
如何改變input框的type屬性值
widget= widgets.TextInput()
widget=widgets.PasswordInput()
如何讓forms組件渲染出來的input框有form-control類屬性
widget= widgets.TextInput(attrs={'class':'form-control others'}) # 若是有多個類屬性 空格隔開
widget=widgets.PasswordInput(attrs={'class':'form-control others'})
每一個字段 還支持正則校驗
from django import forms
from django.forms import Form
from django.core.validators import RegexValidator
class MyForm(Form): user = forms.CharField( validators=[RegexValidator(r'^[0-9]+$', '請輸入數字'), RegexValidator(r'^159[0-9]+$', '數字必須以159開頭')], )