Сохранение представления в одной модели, но в разных экземплярах - не работает
У меня есть представление, которое сохраняет данные формы через 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-запроса, когда пользователь обновляет браузер. браузер.