首先,我做了作业,并试图找到一个类似的问题:)。在过去的几个小时里,我一直在尝试尝试,但无济于事。
我想做的事情看起来很简单。我在Formwizard中有几种形式。在第一种形式中,我有一个文本输入。在下一步中,我有一个FormSet(但这也可以是一个简单的Form),其中包含一个forms.Select(下拉)。我想在此下拉列表中显示文本输入的值。但是,我只是无法正常工作。这是我的代码:
在forms.py中:
class FirstForm(forms.Form):
first_point = forms.CharField(
widget=forms.TextInput(
attrs={
'class' : 'form-control'
}))
class SecondStepForm(forms.Form):
dropdown_select = forms.ChoiceField(
widget=forms.Select(
attrs={'class' : 'form-control'
}))
SecondStepFormSet = formset_factory(SecondStepForm, extra=5)
在views.py中:
FORMS = [("firstform", FirstForm),
("secondform", SecondStepFormSet)]
class FormWizardView(LoginRequiredMixin, SessionWizardView):
template_name = 'test.html'
def get_context_data(self, form, **kwargs):
context = super(FormWizardView, self).get_context_data(form=form, **kwargs)
if self.steps.current == 'secondform':
data_temp = self.get_cleaned_data_for_step('firstform')
data = data_temp['first_point']
print(data)
context.update({'dropdown_select': data})
return context
def done(self, form_list, **kwargs):
return None
在我的html文件中:
{% block content %}
<div class="row">
<div class="col-md-12">
<form action="" method="post">{% csrf_token %}
<table>
{{ wizard.management_form }}
{% if wizard.form.forms %}
{{ wizard.form.management_form }}
{% for form in wizard.form.forms %}
<div>
{{ form.dropdown_select }}
</div>
{% endfor %}
{% else %}
{% for field in wizard.form %}
{{field}}
{% endfor %}
{% endif %}
</table>
{% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}"
class="btn btn-danger btn-sm"
style="width:30%; float:left;">{% trans "Previous" %}</button>
{% endif %}
<input type="submit" value="{% trans "Next" %}"
class="btn btn-danger btn-sm"
style="width:30%; float:right;"/>
</form>
</div>
</div>
{% endblock %}
views.py中的print(data)
语句确实从文本输入中打印值。而且,当我将{{ form.dropdown_select }}
更改为{{ dropdown_select }}
时,模板上的值将更改为文本输入的值。这样一切顺利。我只是无法获取它来填充下拉列表。
有什么想法吗?希望Stackoverflow可以再次帮助我(就像往常一样:))。非常感谢!
答案 0 :(得分:0)
我将回答我自己的问题,并为Formset问题打开另一个问题,以使其尽可能简洁。供以后参考:
我在FormWizardView中介绍了get_form:
def get_form(self, step=None, data=None, files=None):
form = super(FormWizardView, self).get_form(step, data, files)
if 'dropdown_select' in form.fields:
form1_cleaned_data = self.get_cleaned_data_for_step('firstform')
if form1_cleaned_data:
form.fields['dropdown_select'].choices = [item for item in form1_cleaned_data.items()]
return form
正如我在自己的评论中提到的那样,它适用于Form而不适用于Formset,因为我得到了错误FormSet' object has no attribute 'fields'
,当我将get_form放入for循环中时,该错误并不会消失。 / p>