Как объединить формы Django, наборы форм и мастер форм для многошаговой формы - PullRequest
0 голосов
/ 10 июля 2019

Я хочу скопировать следующие структуры форм в приложении Django.Они уже закодированы в приложении PHP.

Layout for first page with fields blurred out. Layout for second page with fields blurred out.

На первой странице есть две отдельные формы для вводагде верхняя форма немного отличается от нижней формы.На данный момент они представляют собой две отдельные формы в файле forms.py, но их можно объединить:

forms.py:

# forms.py
from django import forms
from .models import Data2, Data3 

class ExampleEntryFormTop(forms.Form):
    example_date = forms.DateField(widget=forms.HiddenInput())
    data_top = forms.IntegerField()
    data2 = forms.ModelChoiceField(Data2.objects, to_field_name="name", empty_label=None, widget=forms.RadioSelect)
    additional = forms.MultipleChoiceField(choices=(
        ('one', 'One'),
        ('two', 'Two'),
        ('three', 'Three')),
        widget=forms.CheckboxSelectMultiple
    )
    data3 = forms.ModelChoiceField(Data3.objects, empty_label=None, widget=forms.RadioSelect)
    data4 = forms.MultipleChoiceField(choices=(
        ('alpha', 'Alpha'),
        ('beta', 'Beta'),
        ('gamma', 'Gamma')),
        widget=forms.CheckboxSelectMultiple
        )


class ExampleEntryFormBottom(forms.Form):
    example_date = forms.DateField(widget=forms.HiddenInput())
    data_bottom = forms.IntegerField()
    data2 = forms.ModelChoiceField(Data2.objects, to_field_name="name", empty_label=None, widget=forms.RadioSelect)
    additional = forms.MultipleChoiceField(choices=(
        ('one', 'One'),
        ('two', 'Two'),
        ('three', 'Three')),
        widget=forms.CheckboxSelectMultiple
    )
    data3 = forms.ModelChoiceField(Data2.objects, empty_label=None, widget=forms.RadioSelect)


class ExampleEntryFormPage2(forms.Form):
    example_date = forms.DateField(widget=forms.HiddenInput())
    data_top = forms.IntegerField()
    data_bottom = forms.IntegerField()
    data2 = forms.ModelChoiceField(Data2.objects, to_field_name="name", empty_label=None, widget=forms.RadioSelect)
    additional = forms.MultipleChoiceField(choices=(
        ('one', 'One'),
        ('two', 'Two'),
        ('three', 'Three')),
        widget=forms.CheckboxSelectMultiple
    )
    data3 = forms.ModelChoiceField(Data2.objects, empty_label=None, widget=forms.RadioSelect)

На второй странице мастера мне нужно предварительнозагрузить следующие три дня.Для создания набора форм я использовал следующее:

forms.py:

def get_example_set():
    initial_date = date.today()
    example_days = [initial_date + timedelta(days=x) for x in range(2, 5)]
    ExampleFormset = formset_factory(ExampleEntryFormPage2, max_num=len(example_days))
    form_set = ExampleFormset(initial=[{'example_date': x} for x in example_days])
    return form_set

Однако единственный способ передать этот набор форм в SessionWizardViewЯ использовал get_context_data, который может передаваться в форме, но не выглядит правильным способом сделать это:

views.py:

from formtools.wizard.views import SessionWizardView
from .forms import get_example_set
from django.shortcuts import render
from datetime import date, timedelta


class ExampleWizardView(SessionWizardView):
    template_name = 'example_entry_wizard.html'

    def done(self, form_list, **kwargs):
        return render(self.request, 'done.html', {
            'form_data': [form.cleaned_data for form in form_list],
            })

    def get_form(self, step=None, data=None, files=None):
        form = super(ExampleWizardView, self).get_form(step, data, files)
        step = step or self.steps.current
        form = get_example_set()
        return form

    def get_context_data(self, **kwargs):
        # FIXME: Make this time-zone aware
        context = super(ExampleWizardView, self).get_context_data(**kwargs)
        initial_date = date.today()
        weekday = initial_date.strftime("%A")
        day_one_example = initial_date + timedelta(days=1)
        context['initial_date'] = initial_date
        context['weekday'] = weekday
        context['day_one_example'] = day_one_example
        context['formset'] = get_example_set()
        context['formset_type'] = type(get_example_set())
        return context

    def form_valid(self, form):
        form.save_example()
        return super().form_valid(form)

Я чувствую, что борюсьэтот инструмент, чтобы заставить это работать, но я не уверен, как лучше заставить это работать.Примеры, которые я видел до сих пор, предлагали изменить get_form, чтобы заставить его работать, но я не уверен, как это сделать для этих типов форм.

Это также кажется, когда япопробуйте установить набор форм с помощью функции get_example_set, с которой я сталкиваюсь, потому что у меня нет класса FormSet, скорее, у меня есть объект.

Также я знаю, что там пока нет кода для первой страницы.Я все еще пытаюсь найти лучший подход для добавления этого в FormWizard.

...