Tuhin
Tuhin

Reputation: 85

UpdateView for ModelForm with custom field form

I have two model

Model A:
   fieldA1
   fieldA2

Model B:
   fieldA = ForeignKey(A)
   fieldB1
   fieldB2

I need to create ModelFormB but i need also insert value to Model B via form. So i create

ModelForm B:
  fielda1 = form.CharField()
  fielda2 = form.CharField()
  class Meta:
     model = ModelB
     field = [fielda1, fielda2, fieldb1, fieldb2]

Mu UpdateView code:

class ModelBUpdateView(LoginRequiredMixin, UpdateView):
    model = ModelB
    form_class = ModelFormB
    template_name = "....."
    success_url = reverse_lazy('...')

The problem is, in template i can see only ModelB(fieldb1,fieldb2) instance initial value but fielda1 and fielda2 are completely blank.

How i send the value to fielda1 and fielda2 during updateview?

Upvotes: 0

Views: 1338

Answers (1)

Rob Vezina
Rob Vezina

Reputation: 638

By default, UpdateView will only update a single model. You could override get_initial() and form_valid() to update model A when you save model B.

class ModelBUpdateView(LoginRequiredMixin, UpdateView):
    model = ModelB
    form_class = ModelFormB
    template_name = "....."
    success_url = reverse_lazy('...')

    def get_initial(self):
        initial = super().get_initial()
        initial['fielda1'] = self.object.fieldA.fieldA1
        initial['fielda2'] = self.object.fieldA.fieldA2
        return initial

    def form_valid(self, form):
        response = super().form_valid(form)
        form.instance.fieldA.fieldA1 = form.cleaned_data['fielda1']
        form.instance.fieldA.fieldA2 = form.cleaned_data['fielda2']
        form.instance.fieldA.save()
        return response

Upvotes: 5

Related Questions