Django之From表单(2)

功能强大的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'}) )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值