Django: Всплывающее окно для формы FK CRUD внутри другой формы
Я изучаю Django, поэтому пытаюсь создать мини-приложение для практики.
У меня есть 2 таблицы в БД:
С одной стороны webapp_domicilio, где PK для ID и несколько varchars для информации об адресе. С другой стороны webapp_persona, где PK для ID, некоторые varchars для информации о человеке и FK, ссылающийся на ID адреса (webapp_domicilio.id)
Я создал веб-страницу для добавления нового элемента в webapp_persona, наследуя ModelForm, и теперь я хочу добавить возможность создавать, редактировать и удалять адрес, не выходя с этой страницы, подобно странице Django Admin.
Поискав на stackoverflow, я нашел эту статью: Создание внешних форм как в Django Admin, но принятый ответ приводит меня на 404 страницу документации Django.
Потом я попробовал то, что написано в https://django-addanother.readthedocs.io/en/latest/index.html и мне удалось вставить кнопку "добавить", но она не открывается во всплывающем окне, используя CreatePopupMixin
из django_addanother.views
. Есть момент, где объясняется, как сделать всплывающее окно совместимым с просмотром, но я не очень понимаю его. Я также пытался вставить кнопку 'edit', но она тоже не работает.
Я привожу свой код здесь:
views.py:
def nueva_persona(request):
if request.method == 'POST':
formulario_persona = PersonaForm(request.POST)
if formulario_persona.is_valid():
formulario_persona.save()
return redirect('personas')
else:
formulario_persona = PersonaForm()
return render(request, 'nueva_persona.html', {'formulario_persona': formulario_persona})
def editar_domicilio(request, id):
domicilio = get_object_or_404(Domicilio, pk=id)
if request.method == 'POST':
formulario_domicilio = DomicilioForm(request.POST, instance=domicilio)
if formulario_domicilio.is_valid():
formulario_domicilio.save()
return redirect('domicilios')
else:
formulario_domicilio = DomicilioForm(instance=domicilio)
return render(request, 'editar_domicilio.html', {'formulario_domicilio': formulario_domicilio})
def nuevo_domicilio(request):
if request.method == 'POST':
formulario_domicilio = DomicilioForm(request.POST)
if formulario_domicilio.is_valid():
formulario_domicilio.save()
return redirect('domicilios')
else:
formulario_domicilio = DomicilioForm()
return render(request, 'nuevo_domicilio.html', {'formulario_domicilio': formulario_domicilio})
def eliminar_domicilio(request, id):
domicilio = get_object_or_404(Domicilio, pk=id)
if domicilio:
domicilio.delete()
return redirect('domicilios')
models.py:
class Domicilio(Model):
calle = CharField(max_length=255)
nro = IntegerField()
localidad = CharField(max_length=255)
def __str__(self):
return f'{self.calle} {self.nro} {self.localidad}'
class Persona(Model):
nombre = CharField(max_length=255)
apellido = CharField(max_length=255)
email = CharField(max_length=255)
domicilio = ForeignKey(Domicilio, on_delete=RESTRICT)
def __str__(self):
return f'{self.id} {self.nombre} {self.apellido} {self.email}'
forms.py:
class PersonaForm(ModelForm):
class Meta():
model = Persona
fields = '__all__'
widgets = {
'email': EmailInput(attrs={'type':'email'}),
'domicilio': AddAnotherWidgetWrapper(
Select,
reverse_lazy('nuevo_domicilio'),
),
'domicilio': AddAnotherEditSelectedWidgetWrapper(
Select,
reverse_lazy('nuevo_domicilio'),
reverse_lazy('editar_domicilio', args=['__fk__']),
),
}
class DomicilioForm(ModelForm):
class Meta():
model = Domicilio
fields = '__all__'
widgets = {
'nro': NumberInput(attrs={'type':'number'}),
}
Я хотел бы создать форму, подобную этой:
Когда пользователь пытается создать новую персону, должна открываться форма, подобная этой: Форма добавления персоны
А если пользователь нажмет на кнопку '+', должно открыться вот такое всплывающее окно:
Всплывающее окно с формой добавления домицилио
После того, как пользователь сохранит новый адрес, он должен закрыть всплывающее окно и показать его в выпадающем списке поля 'domicilio'
Thaks and regards