Динамическое заполнение ChoiceField Select в Form / Formwizard - PullRequest
0 голосов
/ 27 февраля 2019

Прежде всего, я сделал домашнее задание и попытался найти похожий вопрос :).Последние пару часов я пробовал, но безрезультатно.

То, что я пытаюсь сделать, кажется очень простым.У меня есть несколько форм в Formwizard.В первой форме у меня есть текстовый ввод.На следующем шаге у меня есть FormSet (но это также может быть простая форма), который содержит формы. Выбор (выпадающий).Я хочу показать значение ввода текста в этом раскрывающемся списке.Однако я просто не могу заставить его работать.Это мой код:

In 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)

In 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 %}

Оператор print(data) в views.py печатает значение из текстового ввода.А также, когда я меняю {{ form.dropdown_select }} на {{ dropdown_select }}, значение в моем шаблоне меняется на значение моего ввода текста.Так что все идет хорошо.Я просто не могу заставить его заполнить выпадающий список.

Есть идеи как это сделать?Надеюсь, Stackoverflow поможет мне еще раз (как это всегда бывает :)).Большое спасибо!

1 Ответ

0 голосов
/ 27 февраля 2019

Я отвечу на свой вопрос и открою еще один для проблемы Formset, чтобы сделать его как можно более чистым.Для дальнейшего использования:

Я ввел get_form в FormWizardView:

 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

Как я уже упоминал в своем собственном комментарии, это работает для формы, а не для Formset, так как я получаю сообщение об ошибкеFormSet' object has no attribute 'fields', который не исчезает, когда я помещаю get_form в цикл for.

...