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

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