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=_("名称"), max_length=30, required=True, widget=forms.TextInput(attrs={‘size‘: 20,}))
    ip = forms.IPAddressField(label=_("IP地址"), max_length=20, required=True, widget=forms.TextInput(attrs={‘size‘: 20,}))
    port = forms.IntegerField(label=_("通信端口"), required=True, widget=forms.TextInput(attrs={‘size‘: 20,}))
    cpunum = forms.IntegerField(label=_("CPU个数"), required=True, widget=forms.TextInput(attrs={‘size‘: 20,}))
    mem = forms.IntegerField(label=_("内存"), required=True, widget=forms.TextInput(attrs={‘size‘: 20,}))
    state = forms.CharField(label=_("状态"), 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("名称", max_length=30, null=True, blank=True, unique=True)
    ip = models.IPAddressField("IP地址", max_length=20,unique=True)
    port = models.IntegerField("通信端口")
    cpunum = models.IntegerField("CPU核数", null=True, blank=True)
    mem = models.IntegerField("内存", null=True, blank=True)
    state = models.CharField("状态", max_length=20, null=True, blank=True)
    def __str__(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 = (
        (‘‘, "---------"),
        (2, "2"),
        (4, "4"),
        (8, "8"),
        (16, "16"),
) 

class ServerForm(ModelForm):
    cpunum = forms.ChoiceField(label=_("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‘, "特急"),
        (‘ugt‘, "紧急"),
        (‘nor‘, "普通"),
) 

class ServerForm(ModelForm):
    level = forms.ChoiceField(label=_("任务等级"),required=True, widget=forms.RadioSelect, choices=level_choice) 

    class Meta:
        model = Server
        fields = (‘name‘, ‘ip‘, ‘prot‘, ‘cpunum‘, ‘mem‘) 

django表单设计涵盖较广,还设计widget等内容,虽与本文相关,但不是本文重点,这里不做详细阐述,有机会再写相关内容。

时间: 2024-10-03 21:54:11

Django中表单的用法深探的相关文章

Django表单处理

我们会从手工打造一个简单的搜索页面开始,看看怎样处理浏览器提交而来的数据.然后我们开始使用Django的forms框架. 搜索 在web应用上,有两个关于搜索获得巨大成功的故事:Google和Yahoo,通过搜索,他们建立了几十亿美元的业务.几乎每个网站都有很大的比例访问量来自这两个搜索引擎.甚至,一个网站是否成功取决于其站内搜索的质量.因此,在我们这个网站添加搜索功能看起来好一些. 开始,在URLconf (mysite.urls)添加搜索视图.添加类似(r'^search/$','mysit

HTML5中表单验证的8种方法(转)

在深人探讨表单验证之前,让我们先思考一下表单验证的真实含义.就其核心而言,表单验证是一套系统,它为终端用户检测无效的控件数据并标记这些错误.换言之,表单验证就是在表单提交服务器前对其进行一系列的检查并通知用户纠正错误. 但是真正的表单验证是什么? 是一种优化. 之所以说表单验证是一种优化,是因为仅通过表单验证机制不足以保证提交给服务器的表单数据是正确和有效的.另一方面,设计表单验证是为了让Web应 用更快地抛出错误.换句话说,最好利用浏览器内置的处理机制来告知用户网页内包含无效的表单控件值.过去

Django的ModelForm简单用法

Django中内置了Form和Model两个类,有时候页面的表单form类与Model类是一一对应,因此分别定义Form类和Model类会比较麻烦,最简单的方式就是通过Model来生成一个Form类,Django内置的ModelForm就是为此而生的.下面以一个简单的例子来说明它的简单用法. 基本需求 收集用户的日本报名信息 其中JLPT的日语等级分为N1,N2,N3,N4,N5:所以需要一个选择器. 用户需要手动输入姓名,因此需要一个输入框. 在Project中新建一个app $ python

django之缓存的用法, 文件形式与 redis的基本使用

django的缓存的用法讲解 1. django缓存: 缓存的机制出现主要是缓解了数据库的压力而存在的 2. 动态网站中,用户的请求都会去数据库中进行相应的操作,缓存的出现是提高了网站的并发量 3. django的缓存分为 : 三种粒度, 六种缓存方式: 4. 什么是三种粒度: 全站缓存, 单页面缓存, 页面中局部缓存 6. 六种缓存方式: 开发调试缓存, 内存缓存, 文件缓存, 数据库缓存, Memcache缓存(使用python-memcached, pylibmc 两种) 7. 在Djan

7Python全栈之路系列之Django表单

Python全栈之路系列之Django表单 从Request对象中获取数据 HttpRequest对象包含当前请求URL的一些信息: 熟悉/方法 描述 例如 request.path 除域名以外的请求路径 /hello/ request.get_host() 访问的域名 127.0.0.1:8000" or www.example.com request.get_full_path() 请求路径,可能包含查询字符串 /hello/?print=true request.is_secure() 是

struts2.3.16中表单重复提交出现空指针异常

异常代码形式: 严重: Exception occurred during processing request: nulljava.lang.NullPointerException    at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(LocalizedTextUtil.java:630)    at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(Local

django中tag的用法

新建一个tags.py from django import templateregister = template.Library() def short_msg(value): if len(value) > 50: return value[:50]+" ......" else: return value register.filter('short_msg', short_msg) 在html页面中 {% extends "base.html" %}

Django返回json数据用法示例

最近在写前端ajax发送请求到后台,结果数据提交成功,但是一直未执行成功回调函数,经过多番查找资料,终于找到答案. 本文实例讲述了Django返回json数据用法.分享给大家供大家参考,具体如下: 1.前端.jQuery发送GET请求,并解析json数据.getJSON方法可参考这里. ? 1 2 3 4 5 url = "http://example/?question=" + question + "&rand=" + Math.random(); $.

60秒验证码倒计时js代码 js样式代码 方块上下左右随机移动(定时器) js中获取元素的方法 js中表单提交

60秒验证码倒计时js代码 <script type="text/javascript"> var countdown=60; function settime(val) { if (countdown == 0) { //removeAttribute() 方法删除指定的属性. disabled属性规定应该禁用 input 元素. val.removeAttribute("disabled"); val.value="免费获取验证码"