Sto provando a usare inlineformset_factory per generare un formset. I miei modelli sono definite come:Filtro Queryset in Django inlineformset_factory
class Measurement(models.Model):
subject = models.ForeignKey(Subject)
experiment = models.ForeignKey(Experiment)
assay = models.ForeignKey(Assay)
values = models.CommaSeparatedIntegerField(blank=True, null=True)
class Experiment(models.Model):
date = models.DateField()
notes = models.TextField(max_length = 500, blank=True)
subjects= models.ManyToManyField(Subject)
a mio avviso ho:
def add_measurement(request, experiment_id):
experiment = get_object_or_404(Experiment, pk=experiment_id)
MeasurementFormSet = inlineformset_factory(Experiment, Measurement, extra=10, exclude=('experiment'))
if request.method == 'POST':
formset = MeasurementFormSet(request.POST,instance=experiment)
if formset.is_valid():
formset.save()
return HttpResponseRedirect(experiment.get_absolute_url())
else:
formset = MeasurementFormSet(instance=experiment)
return render_to_response("data_entry_form.html", {"formset": formset, "experiment": experiment }, context_instance=RequestContext(request))
ma voglio limitare il campo Measurement.subject ai soli soggetti definiti nel set di query Experiment.subjects. Ho provato un paio di modi diversi per farlo, ma non sono sicuro di quale sia il modo migliore per farlo. Ho provato a scavalcare la classe BaseInlineFormset con un nuovo queryset, ma non riuscivo a capire come passare correttamente il parametro dell'esperimento.
risposta Aggiornato (ho incluso anche le informazioni da qui come un modo per passare il parametro per il formset link):
views.py
def add_measurement(request, experiment_id):
experiment = get_object_or_404(Experiment, pk=experiment_id)
MeasurementFormSet = inlineformset_factory(Experiment, Measurement, extra=10, can_delete=True, form=MeasurementForm)
MeasurementFormSet.form = staticmethod(curry(MeasurementForm, experiment=experiment))
if request.method == 'POST':
formset = MeasurementFormSet(request.POST)
if formset.is_valid():
formset.save()
return HttpResponseRedirect(experiment.get_absolute_url())
else:
formset = MeasurementFormSet()
return render_to_response("data_entry_form.html", {"formset": formset, "experiment": experiment }, context_instance=RequestContext(request))
forms.py
class MeasurementForm(ModelForm):
class Meta:
model = Measurement
def __init__(self, *args, **kwargs):
experiment = kwargs.pop('experiment')
super(MeasurementForm, self).__init__(*args, **kwargs)
self.fields["subject"].queryset = Subject.objects.filter(experiment=experiment)
Non ho mai sentito parlare di un curry() in Python prima, sicuramente non è integrato. EDIT: ... Ahh .. Ho appena notato il post collegato: da django.utils .funzionale import curry – Rich
Funziona ancora in Django 1.5? Viene visualizzato il seguente errore: __init __() ha ottenuto un argomento di parole chiave imprevisto 'empty_permitted' – Puzzled79