Сохранение представления в одной модели, но в разных экземплярах - не работает

У меня есть представление, которое сохраняет данные формы через html-страницу в два разных объекта Person (которые имеют разные ID), но которые находятся в одной таблице (в разных строках)

View

person = Person.objects.filter(pk = user.related_person_id).first()
medical_emergency_person = Person.objects.filter(related_entity=medical_emergency_entity).first()

if request.method == "POST":
   form1 = PersonUpdateForm(request.POST, instance=person)
   form5 = MedicalPersonUpdateForm(request.POST, instance=medical_emergency_person)

   form1.save()
   form5.save()
else:
    form1 = PersonUpdateForm(
        initial= {
           "title": person.title,
           "first_name": person.first_name,
           "last_name": person.last_name,
           "alias": person.alias
        }
    )
    form5 = MedicalPersonUpdateForm(
        initial= {
           "title": medical_emergency_person.title,
           "first_name": medical_emergency_person.first_name,
           "last_name": medical_emergency_person.last_name,
        }
    )

context['personal_person_form'] = form1
context['personal_medical_emergency_person_form'] = form5

Forms

class MedicalPersonUpdateForm(forms.ModelForm):

# FORM META PARAMETERS
class Meta:
    model = Person
    fields = ('title', 'first_name', 'last_name')
    labels = {
        'title': _("Title*"),
        'first_name': _("Emergency Contact First Name*"),
        'last_name': _("Emergency Contact Last Name*")
        }

# FORM INITIALISATION TO SET HTML STYLING
def __init__(self, *args, **kwargs):
    super(MedicalPersonUpdateForm, self).__init__(*args, **kwargs)
    self.fields['title'].widget.attrs['class'] = 'input'
    self.fields['first_name'].widget.attrs['class'] = 'input is-danger'
    self.fields['last_name'].widget.attrs['class'] = 'input is-danger'


class PersonUpdateForm(forms.ModelForm):

# FORM META PARAMETERS
class Meta:
    model = Person
    fields = ('title', 'first_name', 'last_name', 'alias')
    labels = {
        'title': _("Title*"),
        'first_name': _("First Name*"),
        'last_name': _("Last Name*"),
        'alias': _("Alias")
        }

# FORM INITIALISATION TO SET HTML STYLING
def __init__(self, *args, **kwargs):
    super(PersonUpdateForm, self).__init__(*args, **kwargs)
    self.fields['title'].widget.attrs['class'] = 'input'
    self.fields['first_name'].widget.attrs['class'] = 'input is-danger'
    self.fields['last_name'].widget.attrs['class'] = 'input is-danger'
    self.fields['alias'].widget.attrs['class'] = 'input is-danger'

Result

Поведение, которое я получаю, заключается в том, что в базу данных записываются обе записи Person с деталями из формы 5? И затем, когда страница перезагружается на request.post, для полей на странице, оба набора полей firstname и lastname показывают данные только из формы 5, а не из формы 1 и формы 5. Что я делаю неправильно?

Оба имеют одинаковые имена полей. Вы можете избежать этого, работая с prefix=…:

if request.method == 'POST':
    form1 = PersonUpdateForm(request.POST, prefix='person', instance=person)
    form5 = MedicalPersonUpdateForm(request.POST, prefix='medical', instance=medical_emergency_person)
    if form1.is_valid() and form5.is_valid():
        form1.save()
        form5.save()
        return redirect('name-of-some-view')
    
else:
    form1 = PersonUpdateForm(prefix='person', instance=person)
    form5 = MedicalPersonUpdateForm(prefix='medical', instance=medical_emergency_person)
context['personal_person_form'] = form1
context['personal_medical_emergency_person_form'] = form5

Примечание: В случае успешного POST запроса, вы должны сделать redirect. [Django-doc] для реализации паттерна Post/Redirect/Get [wiki]. Это позволяет избежать повторения POST-запроса, когда пользователь обновляет браузер. браузер.

Вернуться на верх