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'}))
完毕!
5.django笔记之form保存表单信息,动态select的更多相关文章
- Django系列之form渲染表单后css样式丢失
最通用的form写法 我们经常看各大网站上写这样的form写法 class SYSAdminPhysicalForm(forms.ModelForm): ''' this form for idc's ...
- Django学习笔记(五)—— 表单
疯狂的暑假学习之 Django学习笔记(五)-- 表单 參考:<The Django Book> 第7章 1. HttpRequest对象的信息 request.path ...
- 解析:使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象
之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...
- 使用easyui的form提交表单,在IE下出现类似附件下载时提示是否保存的现象
之前开发时遇到的一个问题,使用easyui的form提交表单,在Chrome下时没问题的,但是在IE下出现类似附件下载时提示是否保存的现象. 这里记录一下如何解决的.其实这个现象不光是easyui的f ...
- Django - 请求与响应、表单、中间件、上下文处理器
请求与响应篇 一.HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象.视图函数的第一个参数(request)是HttpRequest对象在djang ...
- SpringMVC:学习笔记(5)——数据绑定及表单标签
SpringMVC——数据绑定及表单标签 理解数据绑定 为什么要使用数据绑定 基于HTTP特性,所有的用户输入的请求参数类型都是String,比如下面表单: 按照我们以往所学,如果要获取请求的所有参数 ...
- HTML+CSS笔记 表格,超链接,图片,表单
表格 给表格加入CSS样式,添加表格边框 语法: <style type="text/css"> table tr td,th{border:1px solid #00 ...
- 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 ...
- WP Mail SMTP插件解决Contact Form 7表单提交失败问题
WP Mail SMTP插件解决Contact Form 7表单提交失败问题 WP Mail SMTP是一款非常优秀的解决WordPress主机因为不支持或者是禁用了mail()函数,导致无法实现在线 ...
随机推荐
- COGS8 备用交换机
备用交换机 ★★ 输入文件:gd.in 输出文件:gd.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] n个城市之间有通讯网络,每个城市都有通讯交换机,直接或间 ...
- Bsoj 1322 第K小数
第K小数 Description 现在已有N个整数,你有以下三种操作: 1 A:表示加入一个值为A的整数: 2 B:表示删除其中值为B的整数: 3 K:表示输出这些整数中第K小的数: Input 第一 ...
- Linux VPS新硬盘分区与挂载教程
通过fdisk -l我们可以看到/dev/xvdb(此名称因系统而异)容量有23.6G,而且没有分区,接下来我们对它进行分区和挂载 (红色字为需要输入的部分,黑色字为系统显示部分) 1.fdisk - ...
- WPF捕捉Windows关机事件
private const int SC_SCREENSAVE = 0xF140; private const int WM_QUERYENDSESSION = 0x0011; private boo ...
- HDU4870_Rating_双号从零单排_高斯消元求期望
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4870 原题: Rating Time Limit: 10000/5000 MS (Java/Other ...
- 《Hadoop基础教程》之初识Hadoop
Hadoop一直是我想学习的技术,正巧最近项目组要做电子商城,我就开始研究Hadoop,虽然最后鉴定Hadoop不适用我们的项目,但是我会继续研究下去,技多不压身. <Hadoop基础教程> ...
- Spring+Quartz实现定时任务的配置方法
1.Scheduler的配置 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" ...
- Python打包程序
到py2exe的官网下载程序,注意对应的python版本,比如所用的python版本为2.7,那么就下载适配2.7版本的py2exe软件 下载完成后安装(与普通软件安装方式相同) 2 将要转换的pyt ...
- html tr td colspan
colspan 属性规定单元格可横跨的列数, 第一行的colspan规定其一行所跨越的列数,要与下一行的<td></td>个数一致 if(!empty ($alarmDesc ...
- LVS负载均衡集群服务搭建详解(一)
LVS概述 1.LVS:Linux Virtual Server 四层交换(路由):根据请求报文的目标IP和目标PORT将其转发至后端主机集群中的某台服务器(根据调度算法): 不能够实现应用层的负载均 ...