如何在旅途中在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概念的微弱理解。
答案 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。