在ModelForm(Django)中创建动态字段

时间:2011-05-16 02:39:14

标签: django django-forms

如何在旅途中在ModelForm中创建字段?

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

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

如何以这种方式向用户显示?它是否涉及 _init 定义?是否可以在模型表单类中执行for循环以检索其值并将其转换为要显示的字段?感谢任何建议。

Alpha 

[textbox]
______
Beta

[textbox]

____

etc..

[Submit]

以下是我在模型形式的def init中尝试做的事情:

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

似乎无法给我输出,请记住我对某些django概念的微弱理解。

3 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分: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)

答案 2 :(得分: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。