J'essaie d'utiliser inlineformset_factory pour générer un formset. Mes modèles sont définis comme:Jeu de queries dans 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)
à mon avis j'ai:
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))
mais je veux restreindre le champ Measurement.subject aux seuls sujets définis dans le Experiment.subjects queryset. J'ai essayé quelques manières différentes de faire ceci mais je suis un peu sûr que la meilleure manière d'accomplir ceci est. J'ai essayé de surcharger la classe BaseInlineFormset avec un nouveau jeu de requête, mais je n'ai pas pu déterminer comment passer correctement le paramètre de test.
réponse Mise à jour (je aussi inclus les informations d'ici comme un moyen de passer le paramètre à la 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)
Je n'ai jamais entendu parler d'un curry() en Python avant, ce n'est certainement pas intégré. EDIT: ... Ahh .. Je viens de remarquer le post lié: de django.utils .functional import curry – Rich
Cela fonctionne-t-il encore dans Django 1.5? Je reçois l'erreur suivante: __init __() a un argument mot-clé inattendu 'empty_permitted' – Puzzled79