作者:劉耀
一、使用form保存用戶輸入過的信息
場景:例如 如果用戶注冊,那么他輸入n多個表單之后,那么他提交是時候,如果錯誤返回的時候,那么需要重新再輸入表單內容。這樣會影響用戶體驗,所以,使用form保存用戶輸入過的信息。
不友好的案例:
1.創建工程和app步驟省略
2.url默認
from crm import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^$',views.index),#使用app為crm的views里的函數
]
3.在crm下創建forms.py文件
內容如下:
#!/usr/bin/env python3
#coding:utf8
import re
from django import forms
from django.core.exceptions import ValidationError
#定義一個用於驗證手機號是否合法的函數
def PhoneValidate(value):
#正則匹配
phone_re = re.compile(r'^(13[0-9]|15[012356789]|17[0678]|18[0-9]|14[57])[0-9]{8}$')
if not phone_re.match(value):
raise ValidationError('手機號碼格式錯誤')
class UserInfo(forms.Form):
vip_type = (
(0, u'普通用戶'),
(1, u'高級用戶'),)
vip = forms.CharField(widget=forms.widgets.Select(choices=vip_type,attrs={'class':'form-control'}),
)
user = forms.CharField(error_messages={'required':'用戶名不能為空'})
password = forms.CharField(widget=forms.PasswordInput(),error_messages={'required':'密碼不能為空'})
email = forms.EmailField(required=False) #required是否可以為空,如果為False說明可以為空
phone = forms.CharField(validators=[PhoneValidate,],
error_messages={'required':'手機號不能為空'},
widget=forms.TextInput(attrs={'class':'form-control','placeholder':u'手機號碼'}),
)
4.index.html頁面內容
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.form-control{
background-color:crimson;
}
</style>
</head>
<body>
<form action="" method="post">{% csrf_token %}
<h1>會員級別:{{ obj.vip }}<h5>{{ user_error.vip }}</h5></h1>
<h1>用戶名:{{ obj.user }}<h5>{{ user_error.user }}</h5></h1>
<h1>密碼:{{ obj.password }}<h5>{{ user_error.password }}</h5></h1>
<h1>郵箱:{{ obj.email }}<h5>{{ user_error.email }}</h5></h1>
<h1>手機號:{{ obj.phone }}<h5>{{ user_error.phone }}</h5></h1>
<input type="submit" value="注冊"/>
</form>
</body>
</html>
5.views文件
from django.shortcuts import render,HttpResponse
# Create your views here.
from crm import forms
def index(request):
obj = forms.UserInfo()
if request.method == 'POST':
user_obj = forms.UserInfo(request.POST)
if user_obj.is_valid():
print(user_obj.clean())
else:
user_error = user_obj.errors
print (user_error)
return render(request,'index.html',{'obj':obj,'user_error':user_error})
return render(request,'index.html',{'obj':obj})
以上雖然可以正常驗證,但是當不通過的時候,重新刷新了頁面,不保存用戶之前所輸入的信息。
當我把views里的文件改成一下內容
你輸入錯誤的時候返回也是保存用戶所輸入的信息的
from django.shortcuts import render,HttpResponse
# Create your views here.
from crm import forms
def index(request):
user_obj = forms.UserInfo(request.POST) #如果為空,不影響
if request.method == 'POST':
if user_obj.is_valid():
print(user_obj.clean())
else:
user_error = user_obj.errors
print (user_error)
return render(request,'index.html{'obj':user_obj,'user_error':user_error})
return render(request,'index.html',{'obj':user_obj})
二、from動態select
之前上一篇文章寫一個靜態的select
主要是form文件是這樣的:
class UserInfo(forms.Form):
vip_type = (
(0, u'普通用戶'),
(1, u'高級用戶'),)
vip = forms.CharField(widget=forms.widgets.Select(choices=vip_type,attrs={'class':'form-control'}),
index里
h1>會員級別:{{ obj.vip }}<h5>{{ user_error.vip }}</h5></h1>
這樣就能把select顯示在前端了。
但是問題來了
如果這個vip_type是經常發生變化的。如果是從數據庫里取出來的,那么你就不能每次都修改這個變量里的內容吧。所以就需要動態的select了。
當然可以使用數據庫里的字段
例如:
這是我做論壇的時候的forms
from bbs import models
#文章表單
class ArticleForm(forms.Form):
#文章標題
title = forms.CharField(max_length=255,
min_length=5,
widget=forms.TextInput(attrs={'class':'form-control',
'placeholder':u'文章標 題'}),
error_messages={'required':'標題不能為空'}
)
#文章描述
brief = forms.CharField(max_length=255,
min_length=5,
widget=forms.TextInput(attrs={'class':'form-control',
'placeholder':u'文章描 述'}),
error_messages={'required':'描述不能為空'},
)
#打印出所有標題返回給select
category_model = models.Category.objects.all()
#我定義一個空列表
category_list =[]
#循環我我的model對象
for i in category_model:
#定一個接收id和name的列表
test = []
test.append(i.id)
test.append(i.name)
#添加到空列表
category_list.append(test)
category_id = forms.IntegerField(widget=forms.Select
#把列表給select 這樣前端就是動態的選擇了。
(choices=category_list,attrs={'class':'form-control'}))
#圖片
head_img = forms.ImageField()
#具體內容
content =forms.CharField(widget=forms.Textarea(attrs={'id':'ck-editor'}))
完畢!