5.django筆記之form保存表單信息,動態select


作者:劉耀

一、使用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'}))

完畢!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM