Ho problemi a limitare le scelte selezionabili in un formset. Ho i seguenti modelli: impiegati, dipartimento, progetto, tipo di progetto, appartenenza e ruolo. Un dipendente può aggiungere/rimuovere i ruoli che interpreta per un determinato progetto di reparti nel formset, il modulo dovrebbe limitare i progetti selezionabili solo a quelli appartenenti al reparto a cui appartiene il dipendente.django: come limitare le scelte di campo in formset?
MODELLI:
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))
In questo momento una UE può scegliere un ruolo da svolgere per ogni progetto reparti. Si sta comportando come questo:
Opzioni progetto:
Projects.objects.all()
voglio limitare i progetti con qualcosa di simile: chocies LIMITE progetto per:
Projects.objects.filter(department=i.department)
[Questa domanda Stack Overflow] (http://stackoverflow.com/questions/622982/django-passing-custom-form-parameters-to-formset) è abbastanza simile. Ci sono due approcci che funzionano. 1) creare un modulo che prende dipendente come argomento nel suo metodo '__init__' e usa la funzione curry. 2) Costruisci la classe del modulo nella funzione di visualizzazione.Se non è necessario riutilizzare il modulo altrove, trovo più semplice il secondo approccio. – Alasdair
new to python, strutturate la classe form nella vista proprio come fareste nel model.py? – thedeepfield
Ho ampliato il mio commento come risposta sotto. – Alasdair