Django窗体向导在步骤之间的持续初始数据
问题描述:
我在项目中使用Django Form Wizard。我希望允许用户为特定领域提供初始数据,并且还希望使用提供的初始数据禁用的字段。Django窗体向导在步骤之间的持续初始数据
问题是,当用户点击后退按钮时,初始数据被删除。
例如,这是我的形式(初始数据被设定为第二步骤) 正如你可以看到一切都很好这里,表单字段将被禁用,并且选择的值。现在我们点击next
。
我们点击next
,我们得到没有问题的第二个步骤,但如果我现在点击back
..
表单域仍然禁止,但值了!
我正在使用的代码是这样的(相关部分):
表
CHOICES=[('ONE','Choice 1'),
('TWO','Choice 2'),
('THREE','Choice 3'),
('FOUR','Choice 4'),
]
class BookingForm1(forms.Form):
""" Select reservation type"""
sko = forms.ChoiceField(choices=CHOICES, widget=forms.RadioSelect())
向导
def get_form(self, step=None, data=None, files=None):
form = super(PresentView, self).get_form(step, data, files)
step = step or self.steps.current
initial = {
'sko': {
'initial':'TWO'
}
}
for field in initial:
try:
form.fields[field].widget.attrs['readonly'] = True
form.fields[field].widget.attrs['disabled'] = True
form.fields[field].required = False
form.fields[field].initial = initial[field]['initial']
except:
pass
任何想法,将不胜感激!
答
我能够解决这个问题的方法是删除ChoiceField
类型对象的额外字段。
for field in initial:
try:
field_o = form.fields[field]
# Remove extra choices if Choice field
if type(field_o) == forms.fields.ChoiceField:
field_o.choices = [(key, value) for key,value in field_o.choices if key == initial[field]['initial']]
else:
field_o.widget.attrs['readonly'] = True
field_o.initial = initial[field]['initial']
except:
pass
我没有为您解决问题,但下面解释了为什么它不起作用:当您禁用该字段时,这意味着浏览器不会将该值提交给服务器。当你回到原始表单时,表单被绑定,所以Django使用了表单数据并忽略了“初始”数据。但是,表单数据不包含禁用字段的值,因此表单呈现时没有选择任何值。 – Alasdair