django中动态生成form表单
最近对django真是大爱呀,哈哈。公司有个需求是为一些素材动态生成属性字段,所以需要django来动态生成表单。
一开始的写法如下:
class AddObjForm(forms.Form):
id = forms.CharField()
def __init__(self, *args, **kwargs):
mdfields = copy.deepcopy(kwargs['mdfields'])
del kwargs['mdfields']
super(AddObjForm, self).__init__(*args, **kwargs)
if mdfields is not None:
for f in mdfields:
exestr = ""
if f.showtype == 0:
exestr = 'self.'+f.name+"=forms.CharField()"
else:
exestr = 'self.'+f.name+"=forms.TextField()"
exec(exestr)
但是发现mdfields里面的字段并没有成功生成表单项,而是只有一个ID项。
于是研究了一下form的源码,其构造函数的源码如下:
class BaseForm(StrAndUnicode):
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=ErrorList, label_suffix=':',
empty_permitted=False):
....
self.fields = deepcopy(self.base_fields)
而其在生成html表单的时候,也都是从fields变量生成,所以这样试了一下:
class AddObjForm(forms.Form):
id = forms.CharField()
def __init__(self, *args, **kwargs):
mdfields = copy.deepcopy(kwargs['mdfields'])
del kwargs['mdfields']
super(AddObjForm, self).__init__(*args, **kwargs)
if mdfields is not None:
for f in mdfields:
exestr = ""
if f.showtype == 0:
self.fields['name'] = forms.CharField()
else:
self.fields['name'] = forms.TextField()
果然就OK了,注意super一定要在我们后面的赋值之前,因为否则fields还没有生成……
OK,成果图如下:
PS:
一直使用C++编程,python带给我的是另一种完全不同的体验。
1.你要随时的利用python的动态性,要记住连代码也是可以动态生成
2.库的代码是可见的,你可以认为他封装的已经足够好,你也可以随时去看它的代码实现。(而不是去用man或者msdn)
建议继续学习:
- 使用django+celery+RabbitMQ实现异步执行 (阅读:5956)
- Django 中 "Data truncated for column xxx" 解决方法 (阅读:5213)
- apache+mod_wsgi+django在windows下的部署 (阅读:4996)
- Django框架ORM操作详解 (阅读:4926)
- python-django的中文编码总结 (阅读:4813)
- 回归简单,向Django说再见 (阅读:4325)
- 在dotcloud上部署Django全程记录 (阅读:4120)
- 建立动态规划状态转移方程的练习 (阅读:4132)
- 用C++面向对象的方式动态加载so (阅读:3729)
- Django数据库访问优化 (阅读:3701)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:Dante 来源: Vimer
- 标签: django 动态
- 发布时间:2010-07-23 00:11:59
-
[782] WordPress插件开发 -- 在插件使用 -
[62] Java将Object对象转换为String -
[61] cookie窃取和session劫持 -
[59] 学习:一个并发的Cache -
[55] 你必须了解的Session的本质 -
[53] 再谈“我是怎么招聘程序员的” -
[52] Linux如何统计进程的CPU利用率 -
[49] 最萌域名.cat背后的故事:加泰与西班牙政府 -
[48] 解读iPhone平台的一些优秀设计思路 -
[48] 我对技术方向的一些反思
