django forms定义时的一些小技巧

我们在使用django定义好一个model后,可能需要添加或者修改model数据,此时可以借助于django提供的forms表单组件.

forms表单和model结合使用时,必须在Meta类中指定关联的model和需要展示的字段(field)

django会自动根据每个字段的类型来生成适合的forms字段

如有一个外键字段,django会自动把他转化成其关联的对象而不是简单的展示其关联的id.

一个简单的model关联的forms表单定义,如FlowStageForm1.

class FlowStageForm1(forms.ModelForm):
    class Meta:
        model = WorkFlowStage
        fields = ‘__all__‘
        exclude = [‘work_type‘]  # 排除该字段

有时候forms默认的渲染可能不满足我们的需求,这时就需要通过手动来定义部分字段来满足我们的需求,没有手动定义的字段django会默认帮我们渲染.

但是有时候只是想简单的修改个小地方,如在所有的字段上添加一个默认的类,难道要把所有的字段都定义一遍吗,很蛋疼.

研究了一下官方文档,发现还是有方法的

可以在__init__初始化时直接循环所有的字段,给他们添加一些属性,而不用重新定义他们.

如果一个表有10个字段,有九个字段有共同属性,而有一个需要单独定制widget,这时候只需在forms中单独定义完,在__init__初始化添加通用属性的时候排除他即可,见红色代码处.

再如果我们想改变字段widget但又想保留django提供的一些功能,如果一个字段是外键,当我们自动在forms中定义过后,就不能使用django默认的功能,需要手动写代码去关联其对象,这时候可以在Meta中使用widgets来单独定义该字段的widget同时保留了django提供的一些特性,这样就完美了.

实例见FlowStageForm

# work_flow是WorkFlowStage的外键
class FlowStageForm(forms.ModelForm):
    handler_id = forms.IntegerField(label="参与人ID", required=False,
                                    widget=forms.HiddenInput())
    hook_method_name = forms.CharField(label="钩子程序方法名", required=False,
                                       widget=forms.TextInput(attrs={‘class‘‘form-control‘}))

class Meta:
        model = WorkFlowStage
        fields = ‘__all__‘
        exclude = [‘work_type‘]  排除该字段
        widgets = {
            ‘work_flow‘: forms.Select(attrs={‘class‘‘form-control disabled‘‘required‘‘required‘}),   #work_flow是一个外键
            ‘handler_id_display‘: forms.TextInput(attrs={‘class‘‘form-control disabled‘‘required‘‘required‘})

}

def __init__(self, **kwargs):
        super(FlowStageForm, self).__init__(**kwargs)

#保存用户有自定义过的fields不对其进行更改.
        declared_fields = []
        if self.declared_fields:  自定义过的field
            declared_fields += list(self.declared_fields)
        if self.Meta.widgets:
            declared_fields += list(self.Meta.widgets)  修改过widgets的部件.


        attrs = {‘class‘‘form-control‘‘required‘‘required‘}
        for field in self.fields:
            if field not in declared_fields:  排除掉有过自定义的field
                self.fields[field].widget.attrs.update(attrs)

时间: 2024-11-06 15:49:04

django forms定义时的一些小技巧的相关文章

gdb调试运行时的程序小技巧

使用gdb调试运行时的程序小技巧 标签: 未分类 gdb pstack | 发表时间:2012-10-15 04:32 | 作者:士豪 分享到: 出处:http://rdc.taobao.com/blog/cs 原创文章,欢迎转载.转载请注明:转载自淘宝核心系统团队博客,谢谢! 原文链接地址: 使用gdb调试运行时的程序小技巧 下面介绍我调试时经常遇到的三种问题,如果大家也有类似的问题交流一下解决方法: 情景1:在不中止程序服务的情况下,怎么调试正在运行时的程序 情景2:需要同时看几个变量的值或

[转]使用gdb调试运行时的程序小技巧

原创文章,欢迎转载.转载请注明:转载自淘宝核心系统团队博客,谢谢!原文链接地址:使用gdb调试运行时的程序小技巧 下面介绍我调试时经常遇到的三种问题,如果大家也有类似的问题交流一下解决方法:情景1:在不中止程序服务的情况下,怎么调试正在运行时的程序情景2:需要同时看几个变量的值或者批量查看多个core文件的堆栈信息怎么办情景3:遇到需要查看.队列.链表.树.堆等数据结构里的变量怎么办1. 情景1:在不中止程序服务的情况下,怎么调试正在运行时的程序我们在生产环境或者测试环境,会遇到一些异常,我们需

对于shell脚本参数获取时的一点小技巧

问题如下: 根据脚本参数的个数$#进行一个循环,在依次输出每个参数$1 $2 $3...... 我有一个循环变量i $i 取到这时的i为1,我想使用这个1再去调用$1,也是就是打印出第一个参数 就是$($i)的意思来取到第几个参数,当然$($i)是不好用的 当时纠结了好久,最后上百度提问,两位高手给出了答案: 1) #!/bin/sh NUMBER=$# echo $NUMBER i=1 while [ $i -le $NUMBER ] do a[$i]=$1 #将数组a[i]赋值为$1,即取得

当磁盘被大文件填满时的一些小技巧

当磁盘被大文件填满时的一些小技巧 生产环境中会出现磁盘被一些大文件填满,但是大文件却因为被打开而无法马上删除释放空间的情况,以下技巧是解决此类问题的一种方法 模拟环境 先用/dev/zero 将/boot分区填满 [root@centos7 boot]# cp /dev/zero /boot/bigfile cp: error writing '/boot/bigfile': No space left on device cp: failed to extend '/boot/bigfile'

linux系统维护时的一些小技巧,包括系统挂载新磁盘的方法!可收藏!

这里发布一些平时所用到的小技巧,不多,不过会持续更新.... 1.需要将history创建硬链接ln 全盘需要备份硬链接 ln /etc/xxx /home/xxx 2.root用户不可以远程 /etc/ssh/sshd_config PermitRootLogin no AllowUsers XXX 3.同步软件时钟 date MMDDhhmmCCYY.ss hwclock --set --date="2011-08-14 16:45:05" 4.SSH服务重启及开关 ubuntu

献身说法---修复bug时的一些小技巧

最近,修复了项目当中的一些bug,觉着有些思路可以分享出来供大家借鉴. 场景一 开发环境中系统正常运行,测试环境中,部分机器未能正常运行. 解决过程:远程连接了测试环境中的机器,观察了系统的运行情况,确实比较反常.查看日志后,发现出现了“xxx文件未找到”的异常.确认文件存在后,最先想到的就是,xx http://pic.cnhubei.com/space.php?uid=2732&do=album&id=968203http://pic.cnhubei.com/space.php?uid

Python补充02 Python小技巧

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在这里列举一些我使用Python时积累的小技巧.这些技巧是我在使用Python过程中经常使用的.之前很零碎的记在笔记本中,现在整理出来,和大家分享,也作为Python快速教程的一个补充. import模块 在Python经常使用import声明,以使用其他模块(也就是其它.py文件)中定义的对象. 1) 使用__name__ 当我们编写Python库模块的时候,我们往往运行一些测

使用velocity 小技巧

因为公司的需求,我使用了velocity模板进行文件生成.在这里先记录一下使用velocity模板时的一些小技巧: 1.截取字符串 注意,(1)需要使用.length()获取字符串长度:   (2)最好使用"+(-1)"的形式代替"-1",因为velocity中对减号"-"的支持不友好,容易混淆. 2.$velocityCount(循环遍历计数器) 我们在遇到字符遍历之后需要对字符串之间进行操作(比如添加一个逗号或者其他相同符号),但最后一个字符

给大家分享12个或许能在实际工作中帮助你解决一些问题的JavaScript的小技巧

使用!!操作符转换布尔值 有时候我们需要对一个变量查检其是否存在或者检查值是否有一个有效值,如果存在就返回true值.为了做这样的验证,我们可以使用!!操作符来实现是非常的方便与简单.对于变量可以使用!!variable做检测,只要变量的值为:0.null." ".undefined或者NaN都将返回的是false,反之返回的是true.比如下面的示例: 01 function Account(cash) { 02 this.cash = cash; 03 this.hasMoney