Django的表單庫具有表單集的特性,允許您處理動態添加的表單。例如,如果您的應用程序有一個書籤列表,您可以使用表單集來處理多個表示書籤的表單,則可以使用表單集。以Django形式存儲動態字段
如果你想動態添加一個字段到表單呢?一個例子是一個調查創建頁面,您可以在其中動態添加無限數量的問題。你如何在Django中處理這個問題?
Django的表單庫具有表單集的特性,允許您處理動態添加的表單。例如,如果您的應用程序有一個書籤列表,您可以使用表單集來處理多個表示書籤的表單,則可以使用表單集。以Django形式存儲動態字段
如果你想動態添加一個字段到表單呢?一個例子是一個調查創建頁面,您可以在其中動態添加無限數量的問題。你如何在Django中處理這個問題?
看這最近的職位由雅各卡普蘭,莫斯的Django的創始人之一:"Dynamic form generation"。它使用一個示例來逐步向您顯示過程。很棒的閱讀。 Django的發佈經理也有a 2008 article by James Bennett。
要添加,刪除和更改表格或的ModelForm中的字段,只覆蓋__init__()
這樣的:
class MyForm(forms.Form):
def __init__(self, *args, **kwargs):
user = kwargs.pop('user')
other_stuff = kwargs.pop('stuff')
super(MyForm, self).__init__(*args, **kwargs)
self.fields['my_dynamic_field'] = forms.Field(...)
# Add fields based on user or other_stuff
而且使用這樣的:form = MyForm(user = user, stuff = stuff)
在Python中可以動態地實例化一個類。 knutin展示了一個動態定製基於表單的好例子,並添加了一些字段。
您還可以動態地創建整個窗體,從example given by James Bennett採取:
def make_contact_form(user):
fields = { 'name': forms.CharField(max_length=50),
'email': forms.EmailField(),
'message': forms.CharField(widget=forms.Textarea) }
if not user.is_authenticated():
fields['captcha'] = CaptchaField()
return type('ContactForm', (forms.BaseForm,), { 'base_fields': fields })
注意:我不能將用戶kwarg發送給超__init__;提高「__init __()有一個意想不到的關鍵字參數'用戶'」 – ecdani 2013-04-02 11:19:45
解決:kwargs.pop必須超級調用之前 – ecdani 2013-04-02 11:29:53