2011-09-09 21 views
10

我有一個顯示多個Formset的頁面,每個Formset都有一個前綴。表單集使用默認選項formset_factory創建,包括extra=1。可以使用JavaScript添加或刪除行。Django formset - 僅當沒有初始數據集時才顯示額外字段?

如果用戶正在添加新數據,則會出現一個空白行。完善。

如果用戶已經添加了數據但表單驗證失敗,在這種情況下,表單集使用了MyFormset(data, prefix='o1-formsetname')等POST數據,只有他們輸入的數據才顯示出來。再次,完美。 (o1等動態生成,每個o對應一個「選項」,每個「選項」可能有多個表單集)。

但是,如果用戶正在編輯現有的數據,在這種情況下,鑑於填充使用MyFormset(initial=somedata, prefix='o1-formsetname')其中somedata是從數據庫中的一個模型來的數據的類型的字典列表中的表單集,一個額外的空白行該數據之後插入。除非用戶使用JavaScript明確添加一行,否則不需要顯示空白行。

是否有任何簡單的方法來防止formset顯示額外的行,如果初始數據設置?我在第三個例子中使用initial的原因是,如果我剛剛使用MyFormset(somedata, prefix='o1-formsetname')來傳遞數據,則必須將所有數據重新格式化爲包含每個字段的前綴的POSTdata樣式字典,例如o1-formsetname-1-price: x以及計算管理形式的數據,這增加了整個負荷的複雜性。

一種解決方案可能是攔截表單集,然後再將其發送到模板,並手動刪除該行,但extra_forms屬性似乎沒有可寫的,並設置extra0沒有任何區別。我也可以讓JavaScript檢測這種情況並刪除該行。然而,我不禁想到我錯過了一些明顯的事情,因爲我想要的行爲是對我來說似乎是合理的預期行爲。

謝謝。

+0

我使用Django 1.1,其中'max_num'參數的行爲不同;見下面的回覆。 – garybryan

回答

3

我想出了一個適用於Django 1.1的解決方案。我創建了BaseFormSet的子類,它覆蓋total_form_count方法,因此如果存在初始表單,則總數不包含額外的表單。也許有點破解,也許有更好的解決方案,我找不到,但它的工作原理。

class SensibleFormset(BaseFormSet): 
    def total_form_count(self): 
     """Returns the total number of forms in this FormSet.""" 
     if self.data or self.files: 
      return self.management_form.cleaned_data[TOTAL_FORM_COUNT] 
     else: 
      if self.initial_form_count() > 0: 
       total_forms = self.initial_form_count() 
      else: 
       total_forms = self.initial_form_count() + self.extra 
      if total_forms > self.max_num > 0: 
       total_forms = self.max_num 
      return total_forms 
+0

我在'CreateView'內手動執行'myFormset.extra = 1',並將'inlineformset_factory constructor'中的值設置爲0.認爲這是更少的代碼(一行)。 –

5

使用max_num關鍵字參數formset_factory

MyFormset = formset_factory([...], extra=1, max_num=1) 

有關詳細信息,請limiting the maximum number of forms

其中一個hitch:大概你想能夠進程多個空白表單。這並不難;只要確保不要在POST處理端使用max_num關鍵字參數。

+0

其實我今天又在看這個問題。此解決方案不能按預期工作:如果有多個初始行,則只顯示其中一行,因爲max_num會限制它們。 我認爲這是因爲我在Django 1.1上; 1。1文檔說:「formset_factory的max_num參數使您能夠強制formset將顯示的最大數量的表單」,而1.3文檔則說「formset_factory的max_num參數使您能夠限制formset的空表單的最大數量將顯示「,所以'max_num'的含義已經改變。任何想法1.1? – garybryan

+0

正是需要將表格的數量限制爲一個!簡單和乾淨...最佳答案! – AmiNadimi

相關問題