from 組件

知識補充 :

 l ocation.href="/index/"                                   
  加路徑或者網址均可以
 location.href="http://www.baidu.com"    
在AJAX頁面中 全局跳轉頁面

1、model經常使用操做

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

 

2 , only 和 defer  

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文件,是不會渲染的。

 

二  Form 組件

一 :  from 組件介紹 

  From 組件能夠作的幾件事 : 

  1 , 用戶請求數據驗證

  2 , 自動生成錯誤信息

  3 , 打包用戶提交的正確信息 

  4 , 自動建立input標籤並能夠設置樣式

二 :  From 組件的使用 

   1 , 建立規則

class Foo(From):    # 必須繼承
    username = xxx
    password = xxx  
    email = xxx

注意 :  這裏的字段必須和input的name字段同樣

  2 , 數據和規則進行匹配

先導入模塊

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框中 (編輯的時候用).

 

Widgets 

沒個表單字段都有一個對應的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

 

渲染標籤功能 

渲染方式1

<!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>

 

渲染方式2

<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>

 

渲染方式3

<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>
相關文章
相關標籤/搜索