2011-05-16 110 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)