django小知識(2)

昨日內容回顧
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 }}前端


{% endfor %}
{{ page_obj.page_html|safe }}
建立多對多表關係的三種方式
1.全自動(推薦使用 )
好處在於 django orm會自動幫你建立第三張關係表
可是它只會幫你建立兩個表的關係字段 不會再額外添加字段
雖然方便 可是第三張表的擴展性較差 沒法隨意的添加額外的字段
class Book(models.Model):
...
authors = models.ManyToManyField(to='Author')
class Author(models.Models):
2.純手動(不推薦)
好處在於第三張表能夠任意的添加額外的字段
不足之處在於orm查詢的時候 不少方法都不支持 查詢的時候很是麻煩
class Book(models.Model):
class Author(models.Models):
class Book2Author(models.Model):
book_id = models.ForeignKey(to='Book')
author_id = models.ForeignKey(to='Author')
create_time = models.DateField(auto_now_add=True)
3.半自動(推薦使用
****)
手動建表 可是你會告訴orm 第三張表是你本身建的
orm只須要給我提供方便的查詢方法
第三種雖然可使用orm查詢方法
可是不支持使用
add()
set()
remove()
clear()
class Book(models.Model):
authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book','author'))
class Author(models.Model):
books = models.ManyToManyField(to='Book', through='Book2Author', through_fields=('author', 'book'))
class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
create_time = models.DateField(auto_now_add=True)
# 1.半自動 必定要加兩個額外的參數
through='Book2Author', through_fields=('book','author')
# 2.後面字段的順序
由第三張表經過哪一個字段查詢單表 就把哪一個字段放前面
在設計項目的時候 必定要給本身留後路 防止後續的迭代更新
form校驗組件
1.註冊功能
用戶輸入的用戶名中 不能包含水滸傳
若是包含了 就提示用戶 輸入的內容不符合社會主義核心價值觀
用戶輸入的密碼 不能小於三位
若是密碼少於三位 提示用戶 密碼過短了
(******)
校驗數據一般是先後端都有校驗
可是前端校驗無關緊要 哪怕再牛逼
後端也必需要有校驗 反正一句話 前端可有不校驗 後端必須校驗!!!
1.搭建前端頁面 >>> 渲染頁面
2.獲取前端用戶提交的數據校驗 >>> 校驗數據
3.對數據的校驗的結果 展現到前端頁面給用戶查看 >>> 展現錯誤信息
form組件可以自動幫你完成上面的三件事
1.渲染頁面
2.校驗數據
3.展現錯誤信息
form組件的使用
1.本身要先寫一個類
from django import forms
class MyRegForm(forms.Form):
username = forms.CharField(min_length=3,max_length=8)
password = forms.CharField(min_length=3,max_length=8)
email = forms.EmailField()
如何校驗數據
from app01 import views
# 1.給自定義的類傳一個字典
obj = views.MyRegForm({'username':'jason','password':'12','email':'123'})
# 2.判斷數據是否所有合法
obj.is_valid() # 只有數據所有符合要求才會是True
Out[4]: False
# 3.查看符合校驗規則的數據
obj.cleaned_data
Out[5]: {'username': 'jason'}
# 4.查看不符合條件的數據以及不符合的緣由是什麼
obj.errors
Out[6]:
{
'password': ['Ensure this value has at least 3 characters (it has 2).'],
'email': ['Enter a valid email address.']
}
# 5.校驗數據的時候 默認狀況下類裏面全部的字段都必須傳值
obj = views.MyRegForm({'username':'jason','password':'123'})
obj.is_valid()
Out[12]: False
obj.errors
Out[13]: {'email': ['This field is required.']}
# 6.默認狀況下能夠多傳 可是絕對不能少傳
obj = views.MyRegForm({'username':'jason','password':'1233','email':'123@qq.com','xxx':'ooo'})
obj.is_valid()
Out[15]: True
如何渲染頁面
1.forms組件只會幫你渲染獲取用戶輸入(輸入,選擇,下拉框...)的標籤 提交按鈕須要你本身手動寫

三種渲染前端頁面的方式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 }}
異步


第三種渲染前端頁面的方式:代碼量和擴展性都很高(推薦使用)函數


{% for foo in form_obj %}

{{ foo.label }}{{ foo }}post


{% endfor %}
如何展現錯誤信息
如何取消前端幫咱們作的校驗 form表單中添加一個參數便可

展現錯誤信息 用對象點errors.0

{% for foo in form_obj %}


{{ foo.label }}:{{ foo }}
{{ foo.errors.0 }}


{% endfor %}


from django import forms
class MyRegForm(forms.Form):
username = forms.CharField(min_length=3,max_length=8,label='用戶名',
error_messages={
'min_length':'用戶名最短三位',
'max_length':'用戶名最長八位',
'required':'用戶名不能爲空'
},initial='我是初始值',required=False
)
password = forms.CharField(min_length=3,max_length=8,label='密碼',error_messages={
'min_length':'密碼最短三位',
'max_length':'密碼最長八位',
'required':'密碼不能爲空'
})
email = forms.EmailField(label='郵箱',error_messages={
'required':'郵箱不能爲空',
'invalid':'郵箱格式不正確'
},required=False)
forms組件鉤子函數
針對字段 你還能夠作額外的校驗 須要經過鉤子函數

局部鉤子
    # 當你須要對某一個字段數據進行額外的一些列校驗 你能夠考慮使用鉤子函數
    # 針對單個字段的  使用局部鉤子
    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開頭')],
    )
相關文章
相關標籤/搜索