Я хочу скопировать следующие структуры форм в приложении Django.Они уже закодированы в приложении PHP.
На первой странице есть две отдельные формы для вводагде верхняя форма немного отличается от нижней формы.На данный момент они представляют собой две отдельные формы в файле 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.