Django中表单的用法深探

django的表单设计真的很棒,涉及非常多的功能,今天介绍django较为主流的几种表单使用方法。注:本文中表单与form通用、模型与model通用。
表单、模型的基础知识可以通过django book学习。传送门:http://djangobook.py3k.cn/2.0/
0、用例
我在本篇博客中,将使用同一个用例,前后会以不同的方式表示它,以此介绍不同的表单实现方法。
用例很简单,是一个叫做Server的类(大多数时候也可以理解为数据库中的表)。用例是我直接从项目中拿出来的,简化了一下。Server就是通常我们说的服务器,包括name、ip地址、端口、cpu个数、内存、状态等几个属性。
1、方法1 继承forms
django自带forms类。最简单的表单使用方法就是继承forms实现表单。
具体实现方法,首先引入forms
from django import forms 
然后编写具体的表单
class ServerForm(forms.Form): 
    user = forms.CharField(label=_(u"名称"),max_length=30,required=True,widget=forms.TextInput(attrs={'size': 20,})) 
    ip = forms.IPAddressField(label=_(u"IP地址"),max_length=20,required=True,widget=forms.TextInput(attrs={'size': 20,}))  
    port = forms.IntegerField(label=_(u"通信端口"),required=True,widget=forms.TextInput(attrs={'size': 20,}))  
    cpunum = forms.IntegerField(label=_(u"CPU个数"),required=True,widget=forms.TextInput(attrs={'size': 20,})) 
    mem = forms.IntegerField(label=_(u"内存"),required=True,widget=forms.TextInput(attrs={'size': 20,})) 
    state  = forms.CharField(label=_(u"状态"),max_length=30,required=True,widget=forms.TextInput(attrs={'size': 20,}))  
2、方法2 继承ModelForm
在实际开发中,一般会根据模型(model)生成表单(form),因此继承ModelForm是一种十分常见便捷的用法。
具体实现方法,分为两部分来介绍。
1)建立模型(model)
一般会建立一个叫做“models.py”的文件建立模型。在该文件中,需要引入models
from django.db import models 
然后编写具体的模型
class Server(models.Model): 
    name = models.CharField(u"名称", max_length=30, null=True, blank=True, unique=True) 
    ip = models.IPAddressField(u"IP地址", max_length=20,unique=True) 
    port = models.IntegerField(u"通信端口") 
    cpunum = models.IntegerField(u"CPU核数", null=True, blank=True) 
    mem = models.IntegerField(u"内存",  null=True, blank=True) 
    state = models.CharField(u"状态", max_length=20, null=True, blank=True) 
    def __unicode__(self): 
        return self.name 
    class Meta: 
        ordering = ['name','ip'] 
2)建立表单(form)
一般会建立一个叫做“form.py”的文件建立模型。在该文件中,需要引入ModelForm类和对应的模型(model)类
from django.forms import ModelForm 
from cloud.models import Server 
然后编写具体的表单
class ServerForm(ModelForm): 
    class Meta: 
        model = Server 
model = Server,表明这个表单继承名叫Server的模型。
3、方法3 继承ModelForm,限定属性
接着方法2继续思考,许多时候我们需要表单继承某一个模型,但是不需要继承其全部的属性。结合我们的用例来说,在添加Server时,我们假定我们只需要填写name、ip、port等信息,而不需要填写state。这时我们需要在继承模型Server的基础上,限定属性不包括state。
具体实现方法:
class ServerForm(ModelForm): 
    class Meta: 
        model = Server 
        fields = ('name', 'ip', 'prot', 'cpunum', 'mem') 


4、方法4 继承ModelForm,修改属性
接着方法2、方法3继续思考,有时我们需要表单继承某一个模型,不仅需要限定其属性,还需要修改其中的某些属性。结合我们的用例来说,在添加Server时,我们假定我们只需要填写name、ip、port等信息,不需要填写state。同时,我们假定cupnum(cpu核数)不能任意填写,它只能是2、4、8、16中的一种,这就要求我们在继承模型Server的基础上,修改表单中的cpunum。
具体实现方法:
cpunum_choice = ( 
    ('', u"---------"), 
    (2, u"2"),         
    (4, u"4"),         
    (8, u"8"), 
    (16, u"16"), 

class ServerForm(ModelForm): 
    cpunum = forms.ChoiceField(label=_(u"CPU核数"),required=True, choices=cpunum_choice) 
    class Meta: 
        model = Server 
        fields = ('name', 'ip', 'prot', 'cpunum', 'mem') 
5、方法5 继承ModelForm,添加表单项
接着方法2、方法3继续思考,有时我们需要表单继承某一个模型,不仅需要限定其属性,还需要添加新的表单项。结合我们的用例来说,在添加Server时,我们假定不需要填写state,除此之外还需要填写这个任务的紧急程度(将添加Server看作一个任务)。这时我们需要在继承模型Server的基础上,限定属性不包括state,然后包含一个新的选项“任务等级”。
具体实现方法:
level_choice = ( 
    ('ext', u"特急"), 
    ('ugt', u"紧急"),         
    ('nor', u"普通"),    

class ServerForm(ModelForm): 
    level = forms.ChoiceField(label=_(u"任务等级"),required=True, widget=forms.RadioSelect, choices=level_choice) 
    class Meta: 
        model = Server 
        fields = ('name', 'ip', 'prot', 'cpunum', 'mem') 
django表单设计涵盖较广,还设计widget等内容,虽与本文相关,但不是本文重点,这里不做详细阐述,有机会再写相关内容。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(18086) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~
评论热议
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值