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'}))

完毕!

posted @ 2016-06-14 11:10  刘耀  阅读(8281)  评论(1编辑  收藏  举报