作者:刘耀

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

完毕!

5.django笔记之form保存表单信息,动态select的更多相关文章

  1. Django系列之form渲染表单后css样式丢失

    最通用的form写法 我们经常看各大网站上写这样的form写法 class SYSAdminPhysicalForm(forms.ModelForm): ''' this form for idc's ...

  2. Django学习笔记(五)—— 表单

    疯狂的暑假学习之  Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path         ...

  3. 解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象

    之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...

  4. 使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象

    之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...

  5. Django - 请求与响应、表单、中间件、上下文处理器

    请求与响应篇 一.HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象.视图函数的第一个参数(request)是HttpRequest对象在djang ...

  6. SpringMVC:学习笔记(5)——数据绑定及表单标签

    SpringMVC——数据绑定及表单标签 理解数据绑定 为什么要使用数据绑定 基于HTTP特性,所有的用户输入的请求参数类型都是String,比如下面表单: 按照我们以往所学,如果要获取请求的所有参数 ...

  7. HTML+CSS笔记 表格,超链接,图片,表单

    表格 给表格加入CSS样式,添加表格边框 语法: <style type="text/css"> table tr td,th{border:1px solid #00 ...

  8. Django报错:提交表单报错---RuntimeError: You called this URL via POST, but the URL doesn’t end in a slash and you have APPEND_SLASH set.

    Django报错:提交表单报错---RuntimeError: You called this URL via POST, but the URL doesn’t end in a slash and ...

  9. WP Mail SMTP插件解决Contact Form 7表单提交失败问题

    WP Mail SMTP插件解决Contact Form 7表单提交失败问题 WP Mail SMTP是一款非常优秀的解决WordPress主机因为不支持或者是禁用了mail()函数,导致无法实现在线 ...

随机推荐

  1. 后台管理UI推荐

    目录 一.EasyUI 二.DWZ JUI 三.HUI 四.BUI 五.Ace Admin 六.Metronic 七.H+ UI 八.其它UI 九.总结 最近要做一个企业的OA系统,以前一直使用Eas ...

  2. BIEEE 创建多维钻取分析(4)

    在上一节时,我们创建了一个基于部门号的工资分类汇总. 这里就引出了一个概念:维度 专业的解释大家自行百度,这里就不班门弄斧了.从数据的使用角度看,维度可以简单的理解成“数据分类汇总的一种依据”. 按“ ...

  3. Oracle之自定义函数

    数据库中函数包含四个部分:声明.返回值.函数体和异常处理. --没有参数的函数 create or replace function get_user return varchar2 is v_use ...

  4. 【心得&&体会】

    ★2016.1.1★ 很早就想写这样的一篇blog了,但一直没有抽空去实现,新的一年感觉应该有所改变,故深夜提笔(码字) NOIP卡掉和连续两次月考爆炸,这段时间确实心理不舒服,调节的也不是很到位,但 ...

  5. JQueryEasyUI datagrid框架的基本使用

    http://www.jb51.net/article/35348.htm 今天说说这个datagrid框架的基本使用,这个框架一直以来都是大家比较头疼的框架,尤其是Json数据的拼接,后台前台都很重 ...

  6. java对象存储管理

    java程序在内存中的存储分配情况: 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享, ...

  7. c# 闭包 小例

    class Program { static void fnnn() { string[] k = new string[] { "x", "y", " ...

  8. js中数组以及for循环的使用

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> < ...

  9. php-fpm.conf两个至关重要的参数

    这里规定了PHP-CGI的连接.发送和读取的时间,300秒足够用了,因此我的服务器很少出现504 Gateway Time-out这个错误.最关键的是php-fpm.conf的设置,这个会直接导致50 ...

  10. js获取单选框里面的值

    rt,如果想获取单选框里面的值,该如何获取呢. <script> window.onload = function(){ //通过名字获取 getElementsByName //var ...