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()函数,导致无法实现在线 ...
随机推荐
- 在java类中,是先执行类的构造函数还是先执行类的私有非静态变量
举例子: package test_instance; public class TestClassLoaderTime { public TestClassLoaderTime(){ System. ...
- rqnoj71 拔河比赛
题目描述 superwyh的学校要举行拔河比赛,为了在赛前锻炼大家,老师决定把班里所有人分为两拨,进行拔河因为为锻炼所以为了避免其中一方的实力过强老师决定以体重来划分队伍,尽 量保持两个队伍的体重差最 ...
- Syntax error, annotations are only available if source level is 1.5
在项目上右键 -> Properties -> Java Compiler
- appium跑demo简单实例讲解
安装appium,设置 demo.pyfrom appium import webdriver #要装webdriver,方法查看http://www.cnblogs.com/sincoolvip/p ...
- 架构(Architecture)和框架(Framework)杂谈
1. 架构和框架的设计层次不同 类似于硬件设计,软件设计也分为不同的层次.典型的软件设计层次如下图: 在这个图中我们可以看到,Framework处于Micro-archite ...
- iptables相关
⑴.Iptables规则写法的基本格式是: Iptables [-ttable] COMMAND chain CRETIRIA -j ACTION ⑵.Iptables规则相关参数说明: ...
- mybatis中的resultMap
resultMap <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBL ...
- WPF TabControl 模拟动画
using System; using System.Threading; using System.Windows; using System.Windows.Controls; using Wan ...
- You should blog even if you have no readers
Spencer Fry wrote a great post on "Why entrepreneurs should write." I would further add th ...
- CocoStudio基础教程(5)使用CocoStudio场景编辑器关联组件
1.概述 我们有了UI交互.有了动画人物.有了物理模拟,还差最后一步——将这些元素融合起来.这就要用到cocoStudio中的场景编辑器了.这次我们要将先前我们做过的所有东西都放到一个场景中去.这项工 ...