最后,我自己想通了。
为了解决这个问题,原基于模板的解决方案中的 context_data 应该作为initial 传递给forms.Form 的构造函数。
例如,对于 django CVB,get_initial 是将初始数据传递给表单的正确点
def get_initial(self):
initial = Super(ThisCBV, self).get_initial()
redirect_field_name = self.get_redirect_field_name()
if (redirect_field_name in self.request.GET and
redirect_field_value in self.request.GET):
initial.update({
"redirect_field_name": redirect_field_name,
"redirect_field_value": self.request.REQUEST.get(
redirect_field_name),
})
return initial
那么就可以在forms.Form的实例中动态添加一个字段
def __init__(self, *args, **kwargs):
super(ThisForm, self).__init__(*args, **kwargs)
if ('redirect_field_name' in kwargs['initial'] and
'redirect_field_value' in kwargs['initial']):
self.has_redirection = True
self.redirect_field_name = kwargs['initial'].get('redirect_field_name')
self.redirect_field_value = kwargs['initial'].get('redirect_field_value')
## dynamically add a field into form
hidden_field = forms.CharField(widget=forms.HiddenInput())
self.fields.update({
self.redirect_field_name: hidden_field
})
## show this field in layout
self.helper = FormHelper()
self.helper.layout = Layout(
Field(
self.redirect_field_name,
type='hidden',
value=self.redirect_field_value
)
)