Django Formset: у объекта нет атрибута 'get' - PullRequest
0 голосов
/ 27 февраля 2019

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

В моемFormWizard Я пытаюсь (1) показать Formset на основе ползунка ввода в предыдущем наборе (установка дополнительного значения) и (2) в каждой форме в Formset. Я хочу показать ChoiceField (forms.Select) на основеВвод текста на предыдущем шаге.

С большим поиском в stackoverflow я могу выполнить шаг 1. Шаг 2 почти работает, за исключением того факта, что ChoiceField не обновляется с новымзначения из ввода текста. Это мой код в views.py:

class FormWizardView(LoginRequiredMixin, SessionWizardView):
    template_name = 'test/test.html'


    def get_form_initial(self, step):

        if step == 'formset_step':
            form_class = self.form_list[step]
            data = self.get_cleaned_data_for_step('slider_step')
            if data is not None:
                # To set the extra value in formset based on slider input
                extra = data['number_slider'] 
                form_class.extra = extra

                # To set the ChoiceField value in formset based on text-input
                form1_cleaned_data = self.get_cleaned_data_for_step('text_input_step')
                formset = form_class().forms
                for form in formset:
                    if form1_cleaned_data:
                        form.fields['text_input'].choices = [item for item in form1_cleaned_data.items()]
                        # Print form to test if the form updates
                        print(form)
                return formset

        return super(FormWizardView, self).get_form_initial(step)


    def done(self, form_list, **kwargs):
        do something

        return something

Я пытаюсь вернуть набор форм, но получаю ошибку 'TestForm' object has no attribute 'get'. Возможно, я возвращаю неправильную вещьздесь, но что бы я ни пытался вернуть, это не работает. Возвращение super(FormWizardView, self).get_form_initial(step) просто дает мне пустое ChoiceField, а возвращение формы дает мне ошибку object of type 'TestForm' has no len().

Я также распечатал форму вмоя консоль, и это, кажется, работает правильно.Кто-нибудь знает, что я должен вернуть, чтобы получить населенный пункт ChoiceField?

Большое спасибо!

РЕДАКТИРОВАТЬ: Спасибо за ваш ответ!Когда я изменяю свою get_form:

def get_form(self, step=None, data=None, files=None):
        if step == 'formset_step':
            form_class = self.form_list[step]
            data = self.get_cleaned_data_for_step('slider_step')
            if data is not None:
                # To set the extra value in formset based on slider input
                extra = data['number_slider'] 
                form_class.extra = extra

                # To set the ChoiceField value in formset based on text-input
                form1_cleaned_data = self.get_cleaned_data_for_step('text_input_step')
                formset = form_class().forms
                for form in formset:
                    if form1_cleaned_data:
                        form.fields['text_input'].choices = [item for item in form1_cleaned_data.items()]
                        # Print form to test if the form updates
                        print(form)

        return super(FormWizardView, self).get_form(step, data, files)

, я получаю ошибку ['ManagementForm data is missing or has been tampered with'].При просмотре через StackOverflow кажется, что это проблема с шаблоном (и, в частности, не установка {{ wizard.management_form }}, но я взял простой код из документа Django FormTools, который должен нормально работать. В моем шаблоне у меня есть это:

{% extends "base.html" %}
{% load i18n %}
{% block head %}
{{ wizard.form.media }}
{% endblock %}
{% block content %}
<p>Step {{ wizard.steps.step1 }} of {{ wizard.steps.count }}</p>
<form action="" method="post">{% csrf_token %}
<table>
{{ wizard.management_form }}
{% if wizard.form.forms %}
    {{ wizard.form.management_form }}
    {% for form in wizard.form.forms %}
        {{ form }}
    {% endfor %}
{% else %}
    {{ wizard.form }}
{% endif %}
</table>
{% if wizard.steps.prev %}
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.first }}">{%
˓→trans "first step" %}</button>
<button name="wizard_goto_step" type="submit" value="{{ wizard.steps.prev }}">{%
˓→trans "prev step" %}</button>
{% endif %}
<input type="submit" value="{% trans "submit" %}"/>
</form>
{% endblock %}

Разве я не вижу что-то в шаблоне или моя функция get_form неверна? Большое спасибо за внимание к моей проблеме:)

1 Ответ

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

Метод get_form_initial из мастера форм должен возвращать словарь с начальными данными для формы, которая будет создана, а не саму форму.Если вы хотите изменить всю форму, попробуйте изменить метод get_form.

...