1. 程式人生 > >小白學Django---------------forms元件

小白學Django---------------forms元件

forms元件

  • 校驗欄位功能
  • 渲染標籤功能
  • 渲染錯誤資訊功能
  • 元件的引數配置
  • 區域性鉤子(能走到它,說明前面校驗已經通過了,一定能把該欄位的值取出來)
  • 全域性鉤子(能走到它,前面的全都執行過了,包括區域性鉤子)在做密碼判斷的時候,一定要注意,可能密碼取出來為空
class UserInfo(models.Model):
    name=models.CharField(max_length=32)
    pwd=models.CharField(max_length=32)
    email=models.EmailField()
模板檔案
<!DOCTYPE html>
<html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css"> </head> <body> <div class="container"> {# <div class="row">#} {# <
div
class="col-md-6 col-md-offset-3">
#} {# <form action="" method="post" class="form-group">#} {# 使用者名稱:<input type="text" name="name" class="form-control"> <br>#} {# 密碼: <input type="password" name="pwd" class="form-control"
>
<br>#} {# 確認密碼: <input type="password" name="re_pwd" class="form-control"> <br>#} {# 郵箱: <input type="email" name="email" class="form-control"> <br>#} {# <button>提交</button>#} {# </form>#} {# </div>#} {# </div>#} <hr> <h1 class="text-center">渲染頁碼方式一</h1> <div class="row"> <div class="col-md-6 col-md-offset-3"> <form action="" method="post"> {{ obj.name.label }}:{{ obj.name }} <span>{{ obj.errors.0 }}</span> <br> {{ obj.pwd.label }}:{{ obj.pwd }} <span>{{ obj.errors.0 }}</span> <br> {{ obj.re_pwd.label }}:{{ obj.re_pwd }} <span>{{ obj.errors.0 }} {{ errors }}</span> <br> {{ obj.email.label }}:{{ obj.email }} <span>{{ obj.errors.0 }}</span> <br> <button>提交</button> </form> </div> </div> <hr> <h1 class="text-center">渲染頁碼方式二(for迴圈form物件)</h1> <div class="row"> <div class="col-md-6 col-md-offset-3"> <form action="" method="post" class="form-group"> {% for foo in obj %} {{ foo.label }}{{ foo }} <span>{{ foo.errors }}</span> <br> {% endfor %} <button>提交</button> </form> </div> </div> {# <hr>#} {# <h1>渲染頁碼方式三(不建議用,不易拓展)</h1>#} {# <form action="" method="post">#} {# {{ obj.as_p }}#} {# <button>提交</button>#} {# </form>#} </div> </body> </html>
檢視檔案
from django.shortcuts import render, HttpResponse, redirect
from app01.models import *
from django import forms
from django.forms import widgets
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError

class RegForm(forms.Form):
    name = forms.CharField(max_length=10,
                           min_length=2,
                           label='使用者名稱',
                           error_messages={
                               'required': '該字典必填',
                               'max_length': '太長了',
                               'min_length': '太短了'
                           },
                           widget=widgets.TextInput(attrs={'class':'form-control'}))

    pwd = forms.CharField(max_length=10,
                          min_length=2,
                          label='密碼',
                          widget=widgets.PasswordInput(attrs={'class':'form-control'}))

    re_pwd = forms.CharField(max_length=10,
                             min_length=2,
                             label='確認密碼',
                             widget=widgets.PasswordInput(attrs={'class':'form-control'}))

    email = forms.EmailField(label='郵箱',
                             error_messages={
                                 'invalid': '不符合郵箱格式'
                             },
                             widget=widgets.EmailInput(attrs={'class':'form-control'}))

    # 區域性鉤子(多了一個我自己寫校驗規則的方式)
    def clean_name(self):
        name = self.cleaned_data.get('name')
        user = UserInfo.objects.filter(name=name).first()
        if user:
            raise ValidationError('使用者已存在')
        else:
            if name.startswith('sb'):
                raise ValidationError('不能以sb開頭')
            return name

    # 全域性鉤子
    def clean(self):
        pwd = self.cleaned_data.get('pwd')
        re_pwd = self.cleaned_data.get('re_pwd')
        if pwd and re_pwd:
            if pwd == re_pwd:
                return self.cleaned_data
            else:
                raise ValidationError('密碼不一致')

# def form_test(request):
# form沒有的欄位不會被校驗,一旦校驗通過,cleaned_data裡面也沒有這個欄位
# form有的欄位如果不傳,一定校驗不通過
# obj = RegForm({'name':'l','password':'12','email':'[email protected]'})
# 返回一個布林型別,True代表裡面所有欄位都校驗通過
# print(obj.is_valid())
# if obj.is_valid():
# 校驗通過的欄位放在裡面
# print('cleaned_data:',obj.cleaned_data)
# else:
#     print('errors:',obj.errors)
#     print(obj.errors.get('name')[0])
#     print('errors_type:',type(obj.errors))
#     from django.forms.utils import ErrorDict
# return render(request,'form_test.html')


def form_test(request):
    obj = RegForm()
    if request.method == 'POST':
        obj = RegForm(request.POST)
        if obj.is_valid():
            # 把字典打散為關鍵字形式
            UserInfo.objects.create(**obj.cleaned_data)
            # return HttpResponse('ok')
        else:
            print(obj.errors.as_data())
            errors = obj.errors.get('__all__','')
            # print(obj['name'].errors.as_data())
            # return HttpResponse('失敗')
    return render(request, 'form_test.html', locals())

相關推薦

Django---------------forms元件

forms元件 校驗欄位功能 渲染標籤功能 渲染錯誤資訊功能 元件的引數配置 區域性鉤子(能走到它,說明前面校驗已經通過了,一定能把該欄位的值取出來) 全域性鉤子(能走到它,前面的全都執行過了,包括區域性鉤子)在做密碼判斷的時候,一定要注意,可能密碼取出來為空

Django----------分頁器元件

分頁器元件 1.Django的分頁器(paginator) 在頁面顯示分頁資料,需要用到Django分頁器元件 匯入:from django.core.paginator import Paginator Paginator物件: paginator = Paginat

Django----------中介軟體

中介軟體 定義:是介於request與response處理之間的一道處理過程,相對比較輕量級,並且在全域性上改變django的輸入與輸出。因為改變的是全域性,所以需要謹慎實用,用不好會影響到效能。 1.中介軟體有什麼用 如果你想修改請求,例如被傳送到view中的HttpReque

Django-------------Cookie與Session

一.Cookie 1.cookie的由來 大家都知道HTTP協議是無狀態的。 無狀態的意思就是每次請求都是獨立的,它的執行情況和結果與前面的請求和之後的請求都無直接關係,它不會受前面的請求響應情況直接影響,也不會直接影響後面的請求響應情況。而狀態可以理解為客戶端和伺服器在某次會話

Django-----------初識Ajax

Ajax 一.什麼是Ajax AJAX(Asynchronous Javascript And XML),就是“非同步Javascript和XML”。即使用Javascript語言與伺服器進行非同步互動,傳輸的資料為XML(當然,傳輸的資料不只是XML,現在更多使用json資料)。

Django---------------多表操作

一.多表操作 1.建立模型 假如有以下幾個模型及關係: 作者模型:一個作者有姓名和年齡。 作者詳細模型:把作者的詳情放到詳情表,包含生日,手機號,家庭住址等資訊。作者詳情模型和作者模型之間是一對一的關係(one-to-one) 出版商模型:出版商有名稱,所在城市以及ema

Django---------------模板層

一.Django------模板層 1.模板簡介 模版語法重點:   變數:{{ 變數名 }}     1 深度查詢 用句點符     2 過濾器   標籤:{{% % }} 2.模版語法之變數 views.py from django.shortcuts impor

Django------------------web應用,HTTP,URL

一.web應用 web應用程式 Web應用程式是一種可以通過Web訪問的應用程式,程式的最大好處是使用者很容易訪問應用程式,使用者只需要有瀏覽器即可,不需要再安裝其他軟體。應用程式有兩種模式C/S、B/S。C/S是客戶端/伺服器端程式,也就是說這類程式一般獨立執

Django---------------Django簡介與安裝使用

一.Django簡介與安裝使用 1.下載Django 1.開啟cmd 在命令列輸入: pip3 install django pip install django==1.11.9 -i http://pypi.hustunique.org/simple

tkinter(Scrollbar元件 滾動條)

Scrollbar(滾動條),可以單獨使用,但大多的還是與其它控制元件(Listbox,Text,Canva等)結合使用。 '''1.建立一個Scrollbar''' from Tkinter i

tkinter(LabelFrame元件)

LabelFrame: labelframe是一個簡單的容器構件。其主要目的是作為一個間隔或複雜的窗口布局容器. 該部件有一幀的功能,加上能夠顯示標籤. 語法: w = LabelFrame( m

tkinter(Toplevel元件(頂級視窗),用於彈窗)

Toplevel(頂級視窗),類似於彈出視窗,具有獨立的視窗屬性(如標題欄、邊框等) 下邊的例子中,在root視窗新增一個按鈕,點一下彈出一個頂級視窗。 from tkinter import

tkinter(Entry元件

# Entry用來輸入單行文字 '''''1.第一個Entry程式''' from tkinter import * root = Tk() # 建立entry Entry(root, text='input your text here'

tkinter(單選Radiobutton元件)

#Radiobutton為單選按鈕,即在同一組內只能有一個按鈕被選中,每當選中組內的一個按鈕時,其它的按鈕自動改為非選中態,與其他控制元件不同的是:它有組的概念. '''1.建立一個簡單的Radiobu

前端06

好的 空格 cti 回顧 overflow 目前 效率 col over 回顧一下這幾天吧: 非常後悔的行為: 一口氣看完一遍head first html就一頭開始想著做網頁,實則很多技巧就像剛剛開始學編程就生搬硬套的寫算法,不是這樣不可行,而是這樣的學習曲線很陡峭,很容

前端07

css 寫法 什麽 實現 總結 正在 url text pix 2017-05-12 16:02:53:1.小技巧:在<style type="text/css"><!--.../*your css code*/--></style>利用

前端12

人生 nbsp ons hidden 前端 創建 vertical tab 輸出 1.var string = "you are";var text = string;string = "best";console.log(text); //輸出"you are"變量為一

前端20

javascrip 感覺 空指針 java 自己 struts2 慢慢 畢業 程序員 也許今天都是一個空指針吧1.大致的理解了struts2,因為畢業的需要,不過感覺其實一直都是,啊,java耶。就立馬興致沖沖的去學java,好像學會了java之後自己就會是一個程序員,自己

開發(iOS)OC_ block數據類型(2015-08-08)

main nsobject 改變 char typedef 能夠 div sel 方法 // // main.m // block數據類型 // // Created by admin on 15/8/12. // Copyright (c) 201

開發(iOS)OC_ 經常使用結構體(2015-08-14)

轉換成 tracking 小白 epo idt rgb 表示範圍 dsm tor // // main.m // 經常使用結構體 // // Created by admin on 15/8/13. // Copyright (c) 2015年 admin.