Tengo problemas para limitar las opciones seleccionables en un formset. Tengo los siguientes modelos: Empleados, Departamento, Proyecto, Tipo de proyecto, Membresía y Rol. Un empleado puede agregar/eliminar las funciones que desempeñan para un proyecto de departamentos determinado en el formset, el formulario debe limitar los proyectos seleccionables a solo aquellos que pertenecen al departamento al que pertenece el empleado.django: ¿Cómo limitar las opciones de campo en formset?
MODELOS:
class Department(models.Model):
name = models.CharField(max_length=20)
def __unicode__(self):
return self.name
class Employee(models.Model):
fname = models.CharField(max_length=15)
department = models.ForeignKey(Department)
def __unicode__(self):
return self.fname
class Projecttype(models.Model):
name = models.CharField(max_length=20)
def __unicode__(self):
return self.name
class Project(models.Model):
projecttype = models.ForeignKey(Projecttype)
department = models.ForeignKey(Department)
members = models.ManyToManyField(Employee, through='Membership')
def __unicode__(self):
return "%s > %s" % (self.department, self.projecttype)
class Role(models.Model):
name = models.CharField(max_length=20)
def __unicode__(self):
return self.name
class Membership(models.Model):
project = models.ForeignKey(Project, null=True)
department = models.ForeignKey(Department)
employee = models.ForeignKey(Employee)
role = models.ManyToManyField(Role, blank=True, null=True)
class Meta:
unique_together = (("project", "employee",),)
Vista:
def employee_edit(request, employee_id):
i = get_object_or_404(Employee, pk=employee_id)
MembershipFormSet = modelformset_factory(Membership, exclude=('department', 'employee'),)
f = MembershipFormSet(queryset=Membership.objects.filter(employee=i),)
return render_to_response('gcs/edit.html', {'item': i, 'formset': f, }, context_instance=RequestContext(request))
En este momento una UE puede seleccionar una función que cumplir para cualquier proyecto de departamentos. Se está actuando de esta manera:
Opciones del proyecto:
Projects.objects.all()
quiero limitar los proyectos con algo como esto: chocies PROYECTO límite a:
Projects.objects.filter(department=i.department)
[Esta pregunta desbordamiento de pila] (http://stackoverflow.com/questions/622982/django-passing-custom-form-parameters-to-formset) es bastante similar. Hay dos enfoques que funcionan. 1) cree un formulario que tome como argumento al empleado en su método '__init__' y use la función curry. 2) Construye la clase de formulario en la función de vista.Si no necesita reutilizar el formulario en otro lugar, me resulta más fácil el segundo enfoque. – Alasdair
nuevo para Python, ¿estructura la clase de formulario en la vista como lo haría en el modelo.py? – thedeepfield
He ampliado mi comentario como respuesta a continuación. – Alasdair