Форма Django и набор форм вместе на шаге мастера - PullRequest
0 голосов
/ 02 мая 2019

У меня есть мастер форм в Джанго. На первом этапе мне нужно вставить данные о транспортном запросе и сообщение, которое есть в другой модели. На втором этапе я добавляю пассажиров с помощью набора форм, а на последнем - адреса также в форме набора.

Я не знаю, как вставить поле сообщения на первом шаге. Я попытался добавить набор форм в контексте, переопределяющем метод 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'),
    ...
]

Есть идеи?

...