Django:如何在呈现之前但在表单初始化之后修改表单字段的值?

Posted

技术标签:

【中文标题】Django:如何在呈现之前但在表单初始化之后修改表单字段的值?【英文标题】:Django: How can I modify a form field's value before it's rendered but after the form has been initialized? 【发布时间】:2011-06-25 04:09:13 【问题描述】:

给定一个表单,我想在呈现之前更改字段的值。这就是我正在尝试的:

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 已经传递给各个字段(或小部件)了?那么具体需要修改什么属性呢?

【问题讨论】:

@Daniel:添加了更多上下文。我正在覆盖 BaseFormSet。我想在发布后添加一个额外的表单,前提是数据有效。 【参考方案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”。 Initial 必须是一个字典,其中键是字段名称,值是您想要的字段值。

【讨论】:

有点晚了,但如果我回到这个,它看起来很有帮助:-) 谢谢。

以上是关于Django:如何在呈现之前但在表单初始化之后修改表单字段的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用所需信息呈现表单字段

Django REST Framework:在列表响应中呈现表单元素

我可以在 django 中的单个表单中使用多个表单集,如果可以的话如何?

在 Django 表单中,如何呈现单选按钮以便在页面上分隔选项?

Django 如何知道呈现表单字段的顺序?

在最终渲染之前替换django模板中的char