在Form / Formwizard

时间:2019-02-26 21:49:04

标签: django django-forms django-formwizard

首先,我做了作业,并试图找到一个类似的问题:)。在过去的几个小时里,我一直在尝试尝试,但无济于事。

我想做的事情看起来很简单。我在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可以再次帮助我(就像往常一样:))。非常感谢!

1 个答案:

答案 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>