2011-02-10 78 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'。初始值必须是一个字典,其中键是字段名称,值是您希望字段的值。

相关问题