1 , 13個API查詢 , all , filter , get , values , values_list , distinct(去重) , order_by , reverse , exclude(排除) , count , first , last , esits(判斷是否存在)css
須要掌握的all、values、values_list的區別html
all:打印的是一個QuerySet集合,一個列表裏面放的對象git
values :是一個字典形式正則表達式
values_list:是一個元組形式 數據庫
all的性能是最低的django
datalist = models.Userinfo.objects.all().only("name","email") # 拿到的仍是一個queryset 集合 , 僅僅取name和email for item in datalist: print(item.id) print(item.name) print(item.pwd) #只要表裏有這個字段,同樣會取到值,額外的會再發一次請求 datalist = models.Userinfo.objects.all().defer("name","email") # 阻止 , 不取name和email for item in datalist: print(item.id) print(item.pwd
注意 : 用only 的話就去取 only 裏面的字段 , 取其餘的字段效率過低 , 儘量的少鏈接數據庫 bootstrap
3 、Django的生命週期瀏覽器
Web服務器網關接口(Python Web Server Gateway Interface,縮寫爲WSGI)服務器
一、首先走wsgi模塊,這個模塊也是一個協議,包括wsgiref和uwsgi。app
二、而後路由分配-------views視圖
三、從數據庫取數據-----------渲染到html
注意若是導入js文件,是不會渲染的。
From 組件能夠作的幾件事 :
1 , 用戶請求數據驗證
2 , 自動生成錯誤信息
3 , 打包用戶提交的正確信息
4 , 自動建立input標籤並能夠設置樣式
class Foo(From): # 必須繼承 username = xxx password = xxx email = xxx
注意 : 這裏的字段必須和input的name字段同樣
先導入模塊
from django.froms import From from django.froms import fields from django.froms import widgets
views.py
from django.shortcuts import render,redirect from app01 import models # Create your views here. from django.forms import Form from django.forms import fields from django.forms import widgets # 一、建立規則 class TeacherForm(Form): #必須繼承Form # 建立字段,本質上是正則表達式 username = fields.CharField( required=True, #必填字段 error_messages={"required":"用戶名不能爲空!!"}, #顯示中文錯誤提示 widget=widgets.TextInput(attrs={"placeholder":"用戶名","class":"form-control"}) #自動生成input框 ) password = fields.CharField(required=True, error_messages={'required': '密碼不能爲空'}, widget=widgets.TextInput(attrs={'placeholder': '密碼', 'class': 'form-control'})) # 不能爲空 email = fields.EmailField( required=True, error_messages={"required":"郵箱不能爲空!!","invalid":"無效的郵箱"}, widget=widgets.EmailInput(attrs={"placeholder": "郵箱", "class": "form-control"}) # 自動生成input框 ) #不能爲空且郵箱格式要一致 # 二、使用規則:將數據和規則進行匹配 def teacherindex(request): teacher_obj = models.UserInfo.objects.all() # print(teacher_obj) return render(request,"teacherindex.html",{"teacher_obj":teacher_obj}) def add(request): if request.method=="GET": form = TeacherForm() #只是讓顯示一個input框 return render(request,"add.html",{"form":form }) else: form = TeacherForm(data=request.POST) # print(form) #<QuerySet [<UserInfo: UserInfo object>, <UserInfo: UserInfo object>, <UserInfo: UserInfo object>]> if form.is_valid():# 開始驗證 # print('執行成功',form.cleaned_data) # 全部匹配成功,字典 # {'username': 'asd', 'password': 'sdf', 'email': 'sadf@live.com','ut_id':1} form.cleaned_data['ut_id'] = 1 #要分的清是班主任仍是講師 models.UserInfo.objects.all().create(**form.cleaned_data) return redirect("/teacherindex/") else: # print("=====?",form.errors,type(form.errors))#返回失敗的結果 # print(form.errors["username"][0]) #拿到返回失敗的結果,渲染到頁面 return render(request,"add.html",{"form":form})
html.py
{% block right %} <h1>添加老師信息</h1> <hr> <form method="post" novalidate> {% csrf_token %} <p>姓名:{{ form.username }}</p>{{ form.errors.username.0 }} <p>密碼:{{ form.password }}</p>{{ form.errors.password.0 }} <p>郵箱:{{ form.email }}</p>{{ form.errors.email.0 }} <p><input type="submit" value="提交"></p> </form> {% endblock %}
若是訪問視圖的是一個GET 請求 , 它將建立一個空的表單實例 , 並將它放置到要渲染的模板的上下文中 , 這是咱們在第一個訪問該URL 時預期發生的狀況 .
若是表單的提交使用POST
請求,那麼視圖將再次建立一個表單實例並使用請求中的數據填充它:form = NameForm(request.POST)
。這叫作」綁定數據至表單「(它如今是一個綁定的表單)。
咱們調用表單的is_valid()
方法;若是它不爲True
,咱們將帶着這個表單返回到模板。這時表單再也不爲空(未綁定),因此HTML 表單將用以前提交的數據填充,而後能夠根據要求編輯並改正它。
若是is_valid()
爲True
,咱們將可以在cleaned_data
屬性中找到全部合法的表單數據。在發送HTTP 重定向給瀏覽器告訴它下一步的去向以前,咱們能夠用這個數據來更新數據庫或者作其它處理。
注意 : from = TeacherForm() # 沒有參數 , 只是一個input 框
form = TeacherForm(data = request.POST) # 數據和規則放置一塊兒 (添加的時候用)
form = TeacherForm(initial={'username':obj.username,'password':obj.password,'email':obj.email}) # 顯示input,而且將數據庫中的默認值填寫到input框中 (編輯的時候用).
沒個表單字段都有一個對應的Widget 類, 它對應一個HTML 表單 Widget , 例如 <input type="text">
在大部分狀況下,字段都具備一個合理的默認Widget。例如,默認狀況下,CharField
具備一個TextInput Widget
,它在HTML 中生成一個<input type="text">
。
無論表單提交的是什麼數據,一旦經過調用is_valid()
成功驗證(is_valid()
返回True
),驗證後的表單數據將位於form.cleaned_data
字典中。這些數據已經爲你轉換好爲Python 的類型。
注:此時,你依然能夠從request.POST
中直接訪問到未驗證的數據,可是訪問驗證後的數據更好一些。
在上面的聯繫表單示例中,is_married將是一個布爾值。相似地,IntegerField
和FloatField
字段分別將值轉換爲Python 的int
和float
。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!-- 最新版本的 Bootstrap 核心 CSS 文件 --> <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <h3>註冊頁面</h3> <div class="container"> <div class="row"> <div class="col-md-6 col-lg-offset-3"> <form action="" method="post"> {% csrf_token %} <div> <label for="">用戶名</label> {{ form.name }} </div> <div> <label for="">密碼</label> {{ form.pwd }} </div> <div> <label for="">確認密碼</label> {{ form.r_pwd }} </div> <div> <label for=""> 郵箱</label> {{ form.email }} </div> <input type="submit" class="btn btn-default pull-right"> </form> </div> </div> </div> </body> </html>
<form action="" method="post"> {% csrf_token %} {% for field in form %} <div> <label for="">{{ field.label }}</label> {{ field }} </div> {% endfor %} <input type="submit" class="btn btn-default pull-right"> </form>
<form action="" method="post"> {% csrf_token %} {{ form.as_p }} <input type="submit" class="btn btn-default pull-right"> </form>
def register(request): if request.method=="POST": form=UserForm(request.POST) if form.is_valid(): print(form.cleaned_data) # 全部乾淨的字段以及對應的值 else: print(form.cleaned_data) # print(form.errors) # ErrorDict : {"校驗錯誤的字段":["錯誤信息",]} print(form.errors.get("name")) # ErrorList ["錯誤信息",] return render(request,"register.html",locals()) form=UserForm() return render(request,"register.html",locals())
<form action="" method="post" novalidate> {% csrf_token %} {% for field in form %} <div> <label for="">{{ field.label }}</label> {{ field }} <span class="pull-right" style="color: red">{{ field.errors.0 }}</span> </div> {% endfor %} <input type="submit" class="btn btn-default"> </form>
# forms組件 from django.forms import widgets wid_01=widgets.TextInput(attrs={"class":"form-control"}) wid_02=widgets.PasswordInput(attrs={"class":"form-control"}) from django.core.exceptions import ValidationError class UserForm(forms.Form): name=forms.CharField(max_length=32, widget=wid_01 ) pwd=forms.CharField(max_length=32,widget=wid_02) r_pwd=forms.CharField(max_length=32,widget=wid_02) email=forms.EmailField(widget=wid_01) tel=forms.CharField(max_length=32,widget=wid_01) # 局部鉤子 def clean_name(self): val=self.cleaned_data.get("name") if not val.isdigit(): return val else: raise ValidationError("用戶名不能是純數字!") # 全局鉤子 def clean(self): pwd=self.cleaned_data.get("pwd") r_pwd=self.cleaned_data.get("r_pwd") if pwd==r_pwd: return self.cleaned_data else: raise ValidationError('兩次密碼不一致!') def register(request): if request.method=="POST": form=UserForm(request.POST) if form.is_valid(): print(form.cleaned_data) # 全部乾淨的字段以及對應的值 else: clean_error=form.errors.get("__all__") return render(request,"register.html",locals()) form=UserForm() return render(request,"register.html",locals())
<form action="" method="post" novalidate> {% csrf_token %} {% for field in form %} <div> <label for="">{{ field.label }}</label> {{ field }} <span class="pull-right" style="color: red"> {% if field.label == 'R pwd' %} <span>{{ clean_error.0 }}</span> {% endif %} {{ field.errors.0 }} </span> </div> {% endfor %} <input type="submit" class="btn btn-default"> </form>