У меня есть мастер форм в Джанго. На первом этапе мне нужно вставить данные о транспортном запросе и сообщение, которое есть в другой модели. На втором этапе я добавляю пассажиров с помощью набора форм, а на последнем - адреса также в форме набора.
Я не знаю, как вставить поле сообщения на первом шаге. Я попытался добавить набор форм в контексте, переопределяющем метод get_context_data из SessionWizardView (код ниже). Это показывает поле, но я не мог понять, как его сохранить.
Я видел этот пост Форма Django с полями из двух разных моделей , но SessionWizardView не позволяет мне добавлять представление с двумя формами в шаге, я могу только добавлять формы.
Я также прочитал этот мастер django, используя форму и набор форм на одном и том же шаге , но он не работает, возможно, потому что это было 6 лет назад.
Моя последняя попытка состояла в том, чтобы добавить настраиваемое поле в транспортную ModelForm (не в приведенном ниже коде), но я думаю, что это не будет правильным способом (я до сих пор не знаю, как сохранить это сообщение). способ).
Код такой:
models.py
class Transporte(models.Model):
#fields about transport here
class Mensagem(models.Model):
#this is the message field
mensagem = models.TextField("Mensagem", blank=True)
transporte = models.ForeignKey(Transporte, on_delete=models.CASCADE)
...
forms.py
class FormTransporte(forms.ModelForm):
class Meta:
model = Transporte
class FormMensagem(forms.ModelForm):
class Meta:
model = Mensagem
exclude = ()
FormsetMensagem = inlineformset_factory(Transporte, Mensagem, form=FormMensagem,extra=1)
...
views.py
FORMS = [("base", FormTransporte),
("passageiros",FormsetPassageiros),
("enderecos",FormsetEnderecos)
]
TEMPLATES = {"base":'transporte/solicitar.html',
"passageiros":'transporte/passageiros.html',
"enderecos":'transporte/enderecos.html'}
class WizardView(SessionWizardView):
def get_template_names(self):
return [TEMPLATES[self.steps.current]]
def get_context_data(self,form, **kwargs):
#Here I try to append the formset in the first step. It shows the
#field, but no success on saving it
data = super(WizardView,self).get_context_data(form,**kwargs)
if self.steps.current == "base":
if self.request.POST:
data['mensagem'] = FormsetMensagem(self.request.POST)
else:
data['mensagem'] = FormsetMensagem()
return data;
def done(self,form_list,form_dict,**kwargs):
form_transporte = form_dict['base']
#the line below doesn't works
form_mensagem = form_dict['base']['mensagem']
instance_transporte = form_transporte.save()
if 'enderecos' in form_dict:
formset_endereco = form_dict['enderecos']
for form_endereco in formset_endereco:
endereco = form_endereco.save(commit=False)
endereco.transporte = instance_transporte
endereco.save()
if 'passageiros' in form_dict:
formset_passageiros = form_dict['passageiros']
for form_passageiros in formset_passageiros:
passageiros = form_passageiros.save(commit=False)
passageiros.transporte = instance_transporte
passageiros.save()
return render(self.request,'transporte/done.html',{
'form_data': [form.cleaned_data for form in form_list],
})
...
urls.py
app_name = 'transporte'
urlpatterns = [
...
path(r'solicitar/',login_required(views.WizardView.as_view(views.FORMS, condition_dict={'passageiros': views.tem_passageiros})), name='solicitar'),
...
]
Есть идеи?