Обновление в трех моделях одновременно в form_valid Django

У меня есть три модели: Propietario, Administrador и Encargado. И у меня есть три формы с ModelForm, вызывающие каждую из этих моделей. Формы могут иметь три варианта в зависимости от того, что делает пользователь:

  1. Если пользователь выбрал вариант A, будут отображаться три формы, где можно заполнить разные данные для каждой формы

  2. Если пользователь выбрал опцию B, отобразятся две формы, где данные, заполненные в форме FormPropietario, сохранят в модели Propietario и автоматически в модели администратора те же данные. И второй формой будет форма модели Encargado.

  3. Если пользователь выбрал опцию 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)

Я работал над этим в течение нескольких дней, и я не могу заставить его работать, как я могу достичь этого? Заранее спасибо.

0 ответов

Другие вопросы по тегам