Con respecto a estos modelos:
class Projects(models.Model): projectDescription = models.CharField(max_length=50,blank=True,null = True,) status = models.IntegerField(choices = Status_CHOICES, default = 4) projectOwner = models.ForeignKey(staff, on_delete=models.CASCADE, blank=True,null = True,) class Updates(models.Model): project = models.ForeignKey(Projects, on_delete=models.CASCADE) update = models.CharField(max_length=50,blank=True,null = True,) updateDate = models.DateTimeField(default = timezone.now, editable = False) addedBy = models.CharField(max_length=35,blank=True,) Quiero crear una vista que muestre formularios para todos los proyectos actuales. Esto es fácil usando un modelformset_factory . Pero, ¿cómo puedo agregar un formulario adicional a cada una de estas instancias de formulario de proyecto para que se pueda realizar una actualización del proyecto (clave externa)? Idealmente, el usuario realiza cambios en varios proyectos, agrega una actualización a uno o varios proyectos y luego envía el formulario para guardar todos los cambios. Lo que tengo a continuación parece estar muy cerca, pero está guardando una actualización para cada proyecto con el valor de lo que haya escrito en el último formulario. Lo cual parece deberse a que la forma no es única. Seguí el camino de usar prefijos que tampoco parecían llevarme a ninguna parte. ¡ayuda!
formulario de actualización
class updateForm(ModelForm): def __init__(self, *args, **kwargs): super(updateForm, self).__init__(*args, **kwargs) class Meta: model = Updates fields = ('update',)vista:
def MDSprojects(request): projects = Projects.objects.filter(dept = 'Assistive Technology') projectFormset = modelformset_factory(Projects, form=EditProjectForm, extra = 0) if request.method == 'POST': formsetA = projectFormset(request.POST,request.FILES) if formsetA.is_valid(): for f in formsetA: formA = f.save(commit = False) id = formA.id formA.save() formsetB = updateForm(request.POST,request.FILES) if formsetB.is_valid(): formB = formsetB.save(commit = False) project = Projects.objects.get(id = id) formB.project = project formB.save() else: print(formsetB.errors) return redirect('MDS_Projects') else: print(formsetA.errors) else: formsetA = projectFormset(queryset = projects) formsetB = updateForm() return render(request,'MDSprojectsB.html',{'formset':formsetA,'formsetB':formsetB,})Plantilla:
<form method="POST" enctype= multipart/form-data> {{ formset.management_form }} {% csrf_token %} {%for form in formset%} {{ form.management_form }} {% for hidden in form.hidden_fields %} {{ hidden }} {% endfor %} <div class="card border-primary mb-3" style="max-width: 85rem;"> <div class="card-header text-primary"> <strong>{{form.instance.projectDescription}}</strong> </div> <div class="card-body text-primary"> Project Name: {{form.projectDescription}}</div> <div class="card-body text-primary"> Status: {{form.status}}</div> <div class="card-body text-primary"> Status: {{form.projectOwner}}</div> <div class="card-body text-primary"> Status: {{form.priority}}</div> <div> {{ formsetB.management_form }} {% for hidden in formsetB.hidden_fields %} {{ hidden }} {% endfor %} {{formsetB}} </div> </div> {% endfor %} <button class="btn btn-success btn" type="submit">Save Changes</button> </form>EDITAR:
Quizás otra forma de explicar mi pregunta es:
Si tuviera los mismos modelos que el anterior:
class Projects(models.Model): projectDescription = models.CharField(max_length=50,blank=True,null = True,) status = models.IntegerField(choices = Status_CHOICES, default = 4) projectOwner = models.ForeignKey(staff, on_delete=models.CASCADE, blank=True,null = True,) class Updates(models.Model): project = models.ForeignKey(Projects, on_delete=models.CASCADE) update = models.CharField(max_length=50,blank=True,null = True,) updateDate = models.DateTimeField(default = timezone.now, editable = False) addedBy = models.CharField(max_length=35,blank=True,)Quiero tener una vista que represente todos los proyectos actuales como formularios individuales para que el usuario pueda realizar cambios en el modelo del proyecto en una sola vista. Además, quiero que el usuario también pueda agregar una actualización a cada proyecto.
Entonces, por ejemplo, si tuviera 3 proyectos, esperaría ver 3 formularios en la página. Cada formulario contendría los campos para modificar este proyecto (por lo que estos campos de formulario se completarían previamente con los valores actuales). Luego, por último (la parte en la que estoy atascado) sería un campo vacío adicional para agregar una actualización al proyecto.