Boz*_*Joe 12 django django-formwizard
我有一个FormWizard,我需要第一个表单中的数据传递给第二个表单的构造函数,以便我可以构建一个动态表单.
我可以通过FormWizard的process_step获取第一个表单的数据.
我使用字段列表的数据库调用创建第二个窗体的字段.
class ConditionWizardDynamicQuestions(forms.Form):
def __init__(self, DynamicQuestions=None, *args, **kwargs):
super(ConditionWizardDynamicQuestions, self).__init__(*args, **kwargs)
questions = Question.objects.filter(MYDATA = DATA_FROM_1STFORM)
for q in questions:
dynField = FieldFactory(q)
self.fields[q.label] = dynField
Run Code Online (Sandbox Code Playgroud)
如何通过DATA_FROM_1STFORM?
我的结果代码:我放弃了表单的init,并将其切换到CreateQuestions def.然后使用向导的get_form覆盖来在创建后更改表单.
class ConditionWizard(SessionFormWizard):
def get_form(self, request, storage, step=None, data=None, files=None):
form = super(ConditionWizard, self).get_form(request, storage, step, data, files)
stepIndex = self.get_step_index(request, storage, step)
if stepIndex == 1:
form.CreateQuestions(request.session["WizardConditionId"])
if stepIndex == 3:
form.fields['hiddenConditionId'].initial = request.session["WizardConditionId"]
form.fields['medicationName'].queryset = Medication.objects.filter(condition = request.session["WizardConditionId"])
return form
Run Code Online (Sandbox Code Playgroud)
我通过覆盖WizardView的get_form_kwargs解决了这个问题.它通常只返回一个get_form填充的空字典,因此通过覆盖它来返回包含您需要预先填充的数据的字典,您可以将kwargs传递给表单init.
def get_form_kwargs(self, step=None):
kwargs = {}
if step == '1':
your_data = self.get_cleaned_data_for_step('0')['your_data']
kwargs.update({'your_data': your_data,})
return kwargs
Run Code Online (Sandbox Code Playgroud)
然后,在你的表单init方法中,你可以在调用super之前弹出kwarg:
self.your_data = kwargs.pop('client', None)
Run Code Online (Sandbox Code Playgroud)
FormWizard已经将每个前一个表单中的数据传递给下一个表单.如果要获取该数据以实例化一个类(例如,如果表单具有所需的特殊关键字参数),一种方法是通过覆盖get_form表单向导类来获取querydict .例如:
class SomeFormWizard(FormWizard):
def get_form(self, step, data=None):
if step == 1 and data: # change this to whatever step requires
# the extra data
extra_data = data.get('key_from_querydict')
if extra_data:
return self.form_list[step](data,
keyword_argument=extra_data,
prefix=self.prefix_for_step(step),
initial=self.initial.get(step, None))
# Fallback for the other forms.
return self.form_list[step](data,
prefix=self.prefix_for_step(step),
initial=self.initial.get(step, None))
Run Code Online (Sandbox Code Playgroud)
请注意,您也可以parse_params(self, request, *args, **kwargs)在FormWizard中覆盖以访问url/request数据,就像在视图中一样,因此如果您有request.user所有表单所需的请求数据(例如),则可能是更好地从那里获取数据.
希望这可以帮助.
| 归档时间: |
|
| 查看次数: |
6205 次 |
| 最近记录: |