作者:刘耀

一、使用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. BZOJ-1061 志愿者招募 线性规划转最小费用最大流+数学模型 建模

    本来一眼建模,以为傻逼题,然后发现自己傻逼...根本没想到神奇的数学模型..... 1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 ...

  2. BZOJ-1070 修车 最小费用最大流+拆点+略坑建图

    1070: [SCOI2007]修车 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3624 Solved: 1452 [Submit][Status] ...

  3. 学习笔记-KMP算法

    按照学习计划和TimeMachine学长的推荐,学习了一下KMP算法. 昨晚晚自习下课前粗略的看了看,发现根本理解不了高端的next数组啊有木有,不过好在在今天系统的学习了之后感觉是有很大提升的了,起 ...

  4. 【poj1201】 Intervals

    http://poj.org/problem?id=1201 (题目链接) 题意 给出n个区间${[ai,bi]}$,要求选出尽可能少的数,使得每个区间i中至少存在${c[i]}$个数. Soluti ...

  5. codevs3031 最富有的人

    题目描述 Description 在你的面前有n堆金子,你只能取走其中的两堆,且总价值为这两堆金子的xor值,你想成为最富有的人,你就要有所选择. 输入描述 Input Description 第一行 ...

  6. C#获得系统打开的端口和状态

    实际是通过c#编程方式调用了CMD命令行,然后调用netstat命令,然后将CMD命令的输出流转到了C#控制台程序上.也可以将结果输出到文件. using System; using System.C ...

  7. PL/0编译器(java version)–Praser.java

    1: package compiler; 2:   3: import java.io.IOException; 4: import java.util.BitSet; 5:   6: /** 7: ...

  8. C++标准转换运算符reinterpret_cast

    C++标准转换运算符reinterpret_cast reinterpret_cast <new_type> (expression) reinterpret_cast运算符是用来处理无关 ...

  9. sql 树 递归

    sql 树 递归 with SubQuery(No,Name,ParentNo) as ( ' union all select A.No,A.Name,A.ParentNo from [Port_D ...

  10. 《JAVA与模式》之享元模式

    <JAVA与模式>之享元模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述享元(Flyweight)模式的: Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨 ...