【问题标题】:Generating Forms in Django在 Django 中生成表单
【发布时间】:2011-04-24 16:22:19
【问题描述】:

我想在 django 中生成动态表单。假设我有一个模型,其中包含由所有表单字段组成的选项。如果我的用户选择 Textarea 选项并给出标签名称,则表单应显示带有给定标签的 textarea。它可以是文本输入、单选按钮等。

所以我的模型看起来像:

TYPE_CHOICES = (
     (u'TextField',u'TextField'),
     (u'TextArea',u'TextArea'),
)

class SocietyForm(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField()
    form_info = models.ForeignKey(FormInfo)


class FormInfo(models.Model):
    label = models.CharField(max_length=255)
    content_type = models.CharField(max_length=100,choices=TYPE_CHOICES)
    form_info = models.ForeignKey(SocietyForm)

到目前为止一切都很好,但是在生成小部件时,我不知道这里 = ) 我想,如果我根据选定的选项生成字典,那么我可以将它分配给表单的小部件。

'''                                                                                                                                                                                                                                                          
def select_form_type(instance):                                                                                                                                                                                                                              
    dict = {}                                                                                                                                                                                                                                                
    if instance.content_type == "TextField":                                                                                                                                                                                                                 
        dict.update({'%s'instance.label:forms.TextInput()})                                                                                                                                                                                                  
    else:                                                                                                                                                                                                                                                    
        dict.update({'%s'instance.label:forms.Textarea()})                                                                                                                                                                                                   
    return dict                                                                                                                                                                                                                                              
'''

#class SocietyJoinForm(forms.ModelForm,instance):

但是,SocietyJoinForm 无法识别实例输入。那么有什么想法吗?

【问题讨论】:

    标签: django forms dynamic


    【解决方案1】:

    我只是偶然发现你的问题是查看所有较旧的问题。如果你已经弄清楚了,请告诉我。

    IMO,最简单的方法是使用 Javascript。除非您创建了自己的表单对象,否则您实际上无法在 Django 中更改它,在这种情况下,您很可能仍然必须使用 Javascript。你可以这样做:

    <script type="text/javascript">
        function display_form_obj(){
            var type_selection = document.getElementById('id_content_type');
            var label = document.getElementById('id_label');
            var dyn_obj = document.getElementById('id_dyn_obj_div');
            if( type_selection.value and label.value ){
                // Display the new object
                if( type_selection.value == 'TextField' ){
                    dyn_obj.innerHTML = '<textarea ...>';  // Fill it with the info you need
                }
                else {
                    dyn_obj.innerHTML = '<input type="text" ...>'; // Fill with needed info
                }
            }
            else {
                dyn_obj.innerHTML = '';
            }
        }
    
        function set_form_obj_events(){
            var type_selection = document.getElementById('id_content_type');
            var label = document.getElementById('id_label');
            if( label.addEventListener ){
                // Netscape, FF
                type_selection.addEventListener('change', display_form_obj, false);
                label.addEventListener('change', display_form_obj, false);
            }
            elif( label.attachEvent ){
                // IE
                type_selection.attachEvent('onchange', display_form_obj);
                label.attachEvent('onchange', display_form_obj);
            }
        }
    
    </script>
    ...
    <form ... onload="set_form_obj_events();">
        {{form.content_type}}
        {{form.label}}
        <div id="id_dyn_obj_div"></div>
        ...
    </form>
    

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-24
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 2017-06-14
      • 2015-06-13
      相关资源
      最近更新 更多