功能强大的Form表单肯定不只有上次那么简单
views.py
from django.shortcuts import render
import django.forms
from django.forms import forms, fields, widgets
class Practice_Form(forms.Form):
#一般的文本字段的
name = fields.CharField(
#字节长度
max_length=30,
min_length=4,
#是否为必填
required=True,
#错误信息
error_messages={'required':'不能为空','max_length':'长度只能在4-30之间','min_length':'长度只能在4-30之间'},
#标记:在输入 前面的
label='用户名',
#在label以及输入框之间
label_suffix='::',
#输入框内的提示
initial='请输入用户名',
#在输入框后面显示帮助信息
help_text="你的名字",
#把输入框的提示显示出来
show_hidden_initial=False,
#不可编辑
# disabled=True,
)
#整型字段
age=fields.IntegerField(
required=True,
label='年龄',
max_value=120,
min_value=1,
error_messages={
'max_value': '太大了',
'min_value': '太小了',
'required':'年龄不能为空',
},)
#邮箱字段
email = fields.EmailField(
required=True,
label="邮箱",
)#文件上传字段,但是在获取页面的时候需要加上request.FiFLES才可以获取到
img = fields.FileField(
label='选择玩家头像',
label_suffix=':',
#是否允许为空
allow_empty_file=True
)
#单选框
cname1=fields.ChoiceField(
#提供选择的内容,获取到的是前面的id
choices=((0,'后羿'),(1,'凯皇'),(2,'孙悟空'),(3,'韩信'),(4,'武则天'),(5,'妲己')),
label='选择玩家的姓名',
label_suffix=":"
)
#单选框类型选择字段,(下面还有一个)
cname = fields.TypedChoiceField(
label="选择模式",
label_suffix=':',
#默认选择id为2的
initial=2,
choices=((0,'人机模式'),(1,'火焰山'),(2,'五军对决'),(3,'大乱斗'),(4,'克隆大战'),(5,'边境突围'))
)
#多选框字段
cname2=fields.MultipleChoiceField(
label="选择禁的英雄:",
#默认选择id为3的
initial=3,
choices=[(1,'典韦'),(2,'凯皇'),(3,'关羽'),(4,'老夫子'),(5,'程咬金'),]
)
#可以把选择的id转换为int或者str类型
cname3=fields.TypedChoiceField(
coerce=lambda x: int(x),
label='类型转换选择:',
choices = [(1, '典韦'), (2, '凯皇'), (3, '关羽'), (4, '老夫子'), (5, '程咬金'), ]
)
#在整型中实现单选框(与ChoiceField一样),通过插件
cname4 = fields.IntegerField(
#插件,需要从dJoango中导入,然后再进行,上面的都是具有默认插件间的。hidden_widget = MultipleHiddenInput
widget=widgets.Select(choices=((1, '典韦'), (2, '凯皇'), (3, '关羽'), (4, '老夫子'), (5, '程咬金'),))
)
#通过插件将文本字段变为选择框,多选的checkbox,后面的可以天剑属性attrs,后面有例子
cname5 = fields.CharField(
label="女性",
widget=widgets.CheckboxInput()
)
#插件将其变为另一种形式的多选
cname6 = fields.MultipleChoiceField(
choices=((0,'人机模式'),(1,'火焰山'),(2,'五军对决'),(3,'大乱斗'),(4,'克隆大战'),(5,'边境突围')),
#默认选择id为1,3 的,这是多选框
initial =[3,1],
widget=widgets.CheckboxSelectMultiple(attrs={'class':'mcf'}) )
#radio单选互斥框
cname7 = fields.MultipleChoiceField(
choices=((0,'人机模式'),(1,'火焰山'),(2,'五军对决'),(3,'大乱斗'),(4,'克隆大战'),(5,'边境突围'))
,initial =[3,1],
widget=widgets.RadioSelect(attrs={'class':'mcf'}) )
def practice(request):
#判断请求的方法
if request.method=='GET':
#创建(空的)表格对象
pra=Practice_Form()
#把对象进行数据化
data={'pra':pra}
#渲染页面,传过去的数据进行渲染在HTML中
return render(request,'practice.html',context=data)
else:
#获取到POST请求中的数据
pra = Practice_Form(request.POST,)
#进行验证(我在HTML页面中是免验证的所以这里不起作用)
pra.is_valid()
data = {'pra': pra}
#判断是否获取到前端数据,并打印获取到的数据
print(pra.cleaned_data)
#作为实验,直接渲染原页面
return render(request,'practice.html',context=data)
为了试验,所以页面HTML页面毫无样式:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>practice</title>
</head>
<body>
<div >
{# 这种方式需要在写url时候在后面写一个name属性,这样更加方便好用 其中novalidata是关闭验证 后面的是上传文件需要指定格式内容#}
<form action="{% url 'practice' %}" novalidate method="post" enctype="multipart/form-data">
{#<form action="/practice/" novalidate method="POST" enctype="multipart/form-data">#}
{# POST提交防止“跨站伪造提交”。原理在服务端随机生成一个token然后传给前端,在提交的时候会跟随请求头一起提交到后端的session进行一个验证,是否一致 #}
{% csrf_token %}
{# 使用快捷生成#}
{{ pra.as_p }}
<hr>
{# 提交按钮#}
<input type="submit" value="提交">
</form>
</div>
<hr>
<div>
<form action="/practice/" novalidate method="post" enctype="multipart/form-data">
{% csrf_token %}
{# 普通生成方式 #}
<p>{{ pra.name.label }}>>{{ pra.name }}{{ pra.errors.name.0 }}</p>
<p>{{ pra.age.label }}>>{{ pra.age }}</p>
{# <p>{{ pra.emial.label }}>>{{ pra.emial }}</p>#}
{# <p>{{ pra.emial.label }}>>{{ pra.emial }}</p>#}
<p>{{ pra.cname1.label }}>>{{ pra.cname1 }}</p>
<p>{{ pra.cname2.label }}>>{{ pra.cname2 }}</p>
<p>{{ pra.cname3.label }}>>{{ pra.cname3 }}</p>
<p>{{ pra.cname4.label }}>>{{ pra.cname4 }}</p>
<p>{{ pra.cname5.label }}>>{{ pra.cname5 }}</p>
<p>{{ pra.cname6.label }}>>{{ pra.cname6 }}</p>
<p>{{ pra.cname7.label }}>>{{ pra.cname7 }}</p>
<input type="submit" value="提交">
</form>
</div>
</body>
</html>
部分显示的效果:主要是显示选择框的样式
互斥的单选框:
#radio单选互斥框
cname7 = fields.MultipleChoiceField(
choices=((0,'人机模式'),(1,'火焰山'),(2,'五军对决'),(3,'大乱斗'),(4,'克隆大战'),(5,'边境突围'))
,initial =[3,1],
widget=widgets.RadioSelect(attrs={'class':'mcf'}) )