小白學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.