Tengo dos modelos, a saber, padre e hijo. He logrado hacer un modelo de formulario para registrar a un Padre. Ahora quiero poder agregar un hijo al padre.
Resultado esperado: cada padre debe tener un enlace que abra un formulario de registro de niños. El campo de nombre principal debe tener el valor inicial del principal.
Actualmente recibo este error,
addChild() falta 1 argumento posicional requerido: 'pk
modelos.py
class Parent(models.Model): surname = models.CharField(max_length=150, null=False, blank=False) first_name = models.CharField(max_length=150, null=False, blank=False) class Child(models.Model): parent = models.ForeignKey(Parent, null=True, blank=True, on_delete=SET_NULL) first_name = models.CharField(max_length=50, null=False, blank=False) last_name = models.CharField(max_length=50, null=False, blank=False)views.py (¿Qué me estoy perdiendo en mi vista addChild?)
def addParent(request): form = ParentForm() if request.method == 'POST': form = ParentForm(request.POST, request.FILES) if form.is_valid(): form.save() def addChild(request, pk): parent = Parent.objects.get(id=pk) form = ChildForm(initial={'parent' :parent}) if request.method == 'POST': form = ChildForm(request.POST) if form.is_valid(): form.save()Se pk que la URL del paquete es parte de la URL, por lo que debe actualizar los patrones de urlpatterns a:
path('add_child/ <int:pk> /', views.addChild, name='add_child'), Si visita la URL, debe visitar add_child/ 123 / con 123 la clave principal del padre para el que desea agregar un hijo.
Dado que la clave principal del padre está en la URL, no tiene mucho sentido mantenerla en el formulario. Puede reescribir ChildForm para:
from django import forms class ChildForm(forms.ModelForm): class Meta: model = Child fields = ['first_name', 'last_name'] # ← no parenty deje que la vista establezca el padre al enviar el formulario:
from django.shortcuts import redirect def addChild(request, pk): if request.method == 'POST': form = ChildForm(request.POST) if form.is_valid(): form.instance .parent_id = pk form.save() return redirect(' name-of-some-view ') else: form = ChildForm(initial={'parent' :parent}) # …Nota : en caso de una solicitud POST exitosa, debe realizar una
redirect[Django-doc] para implementar el patrón Publicar/Redireccionar/Obtener [wiki] . Esto evita que realice la misma solicitud POST cuando el usuario actualiza el navegador.
Nota : Las funciones normalmente se escriben en snake_case , no en PascalCase , por lo tanto, es recomendable cambiar el nombre de su función a
add_child, no a.addChild