【问题标题】:Dynamically populate ChoiceField Select within Form/Formwizard在 Form/Formwizard 中动态填充 ChoiceField Select
【发布时间】:2019-07-20 12:54:41
【问题描述】:

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

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

【问题讨论】:

  • 我自己的部分问题有一个解决方案!我现在可以为表单(还不是表单集)做这件事。我添加了 get_form 函数(如果我也将它用于 Formset,将作为答案发布以供将来参考)。但是,我收到表单集的错误:FormSet' object has no attribute 'fields'。当用 for form in formset.forms: 包装我的 get_from 函数时,错误不会消失。有人对此有任何想法吗?

标签: django django-forms django-formwizard


【解决方案1】:

我将回答我自己的问题并为 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 循环时,该错误不会消失。

【讨论】:

    猜你喜欢
    • 2019-09-29
    • 1970-01-01
    • 2012-10-10
    • 2013-08-02
    • 2021-10-29
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多