2010-03-24 75 views
6

Django的表單庫具有表單集的特性,允許您處理動態添加的表單。例如,如果您的應用程序有一個書籤列表,您可以使用表單集來處理多個表示書籤的表單,則可以使用表單集。以Django形式存儲動態字段

如果你想動態添加一個字段到表單呢?一個例子是一個調查創建頁面,您可以在其中動態添加無限數量的問題。你如何在Django中處理這個問題?

回答

5

要添加,刪除和更改表格或的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)

+0

注意:我不能將用戶kwarg發送給超__init__;提高「__init __()有一個意想不到的關鍵字參數'用戶'」 – ecdani 2013-04-02 11:19:45

+0

解決:kwargs.pop必須超級調用之前 – ecdani 2013-04-02 11:29:53

5

在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 })