2011-05-16 113 views
5

如何在旅途中在ModelForm中创建字段?在ModelForm(Django)中创建动态字段

例如,我要创建3个文本框(because there are 3 entries in the database table)

ID Name Value 
------------------ 
1 Alpha 10 
2 Beta 91  
3 Char 800 

如何以这种方式显示给用户呢?它涉及到_init的定义吗?是否有可能在模型表单类中的对象循环中检索其值并将它们转换为要显示的字段?感谢任何建议。

 
Alpha 

[textbox] 
______ 
Beta 

[textbox] 

____ 

etc.. 

[Submit] 

这是我试图在的ModelForm的Def INIT做:

self.fields['myfield'].widget = forms.Textarea() 

似乎无法给我的输出,不介意我的某些Django的概念弱的理解。

回答

3

是要覆盖__init__,是这样的:

def __init__(self, *args, **kwargs): 
    super(MyModelForm, self).__init__(*args, **kwargs) 
    for foo, bar in jelly: 
     self.fields[foo] = forms.CharField(widget=forms.Textarea()) 

看到大量的详细信息here - 这一切非常适用的ModelForm为好。

+0

您可以添加查询集到forms.CharField获得从数据库中检索的值动态 – vkrams 2011-05-16 03:07:24

10

我认为在这种情况下,您最好的选择是坚持Model formsets。 对于任何其他情况,只需在表单的__init__内将新字段附加到fields属性即可。

def __init__(self, *args, *kwargs): 
    super(MyForm, self).__init__(*args, **kwargs) 
    self.fields.update({ 
     'foo': forms.CharField(widget=forms.Textarea()), 
     'bar': forms.CharField(widget=forms.Textarea()), 
    }) 

请记住,在这种情况下,你必须调用父类的__init__第一,所以你必须在.fields可用。

+0

表单集在这里简单的答案。 – 2011-05-16 08:26:06

5

您还可以使用django.forms.models.ModelFormMetaclass(由django.forms.models.modelform_factory使用)动态定义表单域。这将使用您指定的字段创建ModelForm类,而不是在init中实时更新字段。

from django import forms 
from django.forms.models import ModelForm, ModelFormMetaclass 


model = MyModel 
fields = { 
    'myfield': forms.CharField(widget=forms.Textarea()) 
} 

meta_attrs = { 
    'model': model, 
} 

Meta = type('Meta', (object,), meta_attrs) 

form_class_attrs = { 
    'Meta': Meta, 
} 

form_class_attrs.update(fields) 

MyModelForm = ModelFormMetaclass('MyModelForm', (ModelForm,), form_class_attrs)