2011-02-10 79 views
4

給定一個表單,我想在渲染之前更改一個字段的值。這就是我想:Django:如何在呈現表單之前但在表單初始化之後修改表單字段的值?

class RequiredFormSet(BaseFormSet): 
    def add_form(self): 
     tfc = self.total_form_count() 
     self.forms.append(self._construct_form(tfc)) 
     if self.is_bound: 
      data = self.management_form.data.copy() # make data mutable 
      data[TOTAL_FORM_COUNT] = self.management_form.cleaned_data[TOTAL_FORM_COUNT] + 1 
      self.management_form.data = data 
     else: 
      self.extra += 1 

我以爲一切都被存儲在data,但我想這data已經將傳遞給各個字段(或部件)了嗎?那麼,我需要修改哪些屬性?

+0

這段代碼是什麼? – 2011-02-10 21:54:00

+0

@Daniel:添加更多上下文。我重寫了BaseFormSet。我想在發佈後添加額外的表單,只有在數據有效的情況下。 – mpen 2011-02-10 21:55:29

回答

1

我希望這有助於:

這是在BaseFormSet創建形式的方法:

def _construct_form(self, i, **kwargs): 
    """ 
    Instantiates and returns the i-th form instance in a formset. 
    """ 
    defaults = {'auto_id': self.auto_id, 'prefix': self.add_prefix(i)} 
    if self.is_bound: 
     defaults['data'] = self.data 
     defaults['files'] = self.files 
    if self.initial: 
     try: 
      defaults['initial'] = self.initial[i] 
     except IndexError: 
      pass 
    # Allow extra forms to be empty. 
    if i >= self.initial_form_count(): 
     defaults['empty_permitted'] = True 
    defaults.update(kwargs) 
    form = self.form(**defaults) 
    self.add_fields(form, i) 
    return form 

正如你可以看到有一個名爲「self.initial」的屬性,這是因爲最初通過數據添加到新創建的表單中。如果你想使用_construct_form來添加一個新的表單並設置自定義的初始數據,你應該在調用_construct_form之前修改'self.initial'。初始值必須是一個字典,其中鍵是字段名稱,值是您希望字段的值。

相關問題