技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 其他 --> django中动态生成form表单

django中动态生成form表单

浏览:3536次  出处信息

最近对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,成果图如下:

QQ截图未命名
PS:
一直使用C++编程,python带给我的是另一种完全不同的体验。
1.你要随时的利用python的动态性,要记住连代码也是可以动态生成
2.库的代码是可见的,你可以认为他封装的已经足够好,你也可以随时去看它的代码实现。(而不是去用man或者msdn)

建议继续学习:

  1. 使用django+celery+RabbitMQ实现异步执行    (阅读:5026)
  2. Django 中 "Data truncated for column xxx" 解决方法    (阅读:4344)
  3. apache+mod_wsgi+django在windows下的部署    (阅读:4164)
  4. Django框架ORM操作详解    (阅读:4121)
  5. python-django的中文编码总结    (阅读:3786)
  6. 回归简单,向Django说再见    (阅读:3531)
  7. 建立动态规划状态转移方程的练习    (阅读:3139)
  8. 在dotcloud上部署Django全程记录    (阅读:3081)
  9. 用C++面向对象的方式动态加载so    (阅读:2889)
  10. Django数据库访问优化    (阅读:2923)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Perl的English模块
后一篇:关于PDE/PTE >>
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1