Обновление в трех моделях одновременно в form_valid Django
У меня есть три модели: Propietario, Administrador и Encargado. И у меня есть три формы с ModelForm, вызывающие каждую из этих моделей. Формы могут иметь три варианта в зависимости от того, что делает пользователь:
Если пользователь выбрал вариант A, будут отображаться три формы, где можно заполнить разные данные для каждой формы
Если пользователь выбрал опцию B, отобразятся две формы, где данные, заполненные в форме FormPropietario, сохранят в модели Propietario и автоматически в модели администратора те же данные. И второй формой будет форма модели Encargado.
Если пользователь выбрал опцию C, будет отображаться только одна форма, где данные, заполненные здесь, будут сохранены во всех трех моделях.
Примечание: данные, заполненные в любой из моделей, заменят другую, а не должны создавать новую. Я имею в виду, что если пользователь в начале выбрал опцию A и заполнил три разных данных, а затем выбрал опцию C, данные, заполненные опцией C, должны заменить данные в других моделях, а не создавать новую.
Чтобы добиться этого, я пытался с этим кодом:
Формы:
class FormPropietario(ModelForm):
def __init__(self, *args, **kwargs):
super(FormPropietario, self).__init__(*args, **kwargs)
for field_name, field in self.fields.items():
field.widget.attrs['class'] = 'input-medium'
self.fields['primer_nombre'].widget.attrs['required'] = True
class Meta():
model = Propietario
exclude = ("predio",'rol',)
widgets = {
'fecha_nacimiento' : forms.DateInput(attrs={'type':'date'}),
}
class FormAdministrador(ModelForm):
def __init__(self, *args, **kwargs):
super(FormAdministrador, self).__init__(*args, **kwargs)
for field_name, field in self.fields.items():
field.widget.attrs['class'] = 'input-medium'
self.fields['primer_nombre'].widget.attrs['required'] = True
class Meta():
model = Administrador
exclude = ("predio",'rol')
class FormEncargado(ModelForm):
def __init__(self, *args, **kwargs):
super(FormEncargado, self).__init__(*args, **kwargs)
for field_name, field in self.fields.items():
field.widget.attrs['class'] = 'input-medium'
self.fields['primer_nombre'].widget.attrs['required'] = True
class Meta():
model = Encargado
exclude = ("predio",'rol',)
Представление, которое обрабатывает опцию A, работает нормально:
#PAE
class PAEPropietarioView(UpdateModelMixin,UpdateView):
model = Propietario
form_class = FormPropietario
success_url = '/'
template_name = 'productores/PAE/propietario.html'
def form_valid(self,form):
propietario = Propietario()
propietario = form.save(commit=False)
propietario.rol.add(1)
return super(PAEPropietarioView,self).form_valid(form)
Но проблема заключается в представлении, которое обрабатывает вариант B или C. У меня есть это прямо сейчас, но безуспешно:
class PropietarioAndAdministratorView(UpdateModelMixin,UpdateView):
model = Propietario
form_class = FormPropietario
success_url = '/'
template_name = 'productores/PE/propietario.html'
def form_valid(self, form):
is_valid = super(PropietarioAndAdministratorView,self).form_valid(form)
if is_valid:
admin = Administrador.objects.get_or_create(predio_id=self.kwargs['predio_id'],**form.cleaned_data)
return True
return False
Я тоже пробовал с этой строчкой, но ничего не происходит:
def form_valid(self, form):
Administrador.objects.get_or_create(predio_id=1,**form.cleaned_data)
return super(PropietarioAndAdministratorView, self).form_valid(form)
Я думаю, что я близко, но в следующей строке есть ошибка; эффективно сохраняет в Администраторе, но сохраняет его дважды, один с данными, а другой пустой. Зачем?
Administrador.objects.get_or_create(predio_id=self.kwargs['predio_id'],**form.cleaned_data)
Я работал над этим в течение нескольких дней, и я не могу заставить его работать, как я могу достичь этого? Заранее спасибо.