Estoy tratando de usar inlineformset_factory para generar un formset. Mis modelos se definen como:Filter Queryset en 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)
en mi opinión que tengo:
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))
pero yo desee restringir el campo Measurement.subject sólo a los sujetos definidos en el conjunto de consultas Experiment.subjects. He intentado un par de formas diferentes de hacerlo, pero no estoy seguro de cuál es la mejor manera de lograrlo. Traté de sobrepasar la clase BaseInlineFormset con un nuevo conjunto de preguntas, pero no pude averiguar cómo pasar correctamente el parámetro del experimento.
respuesta Actualizado (I también se incluyó la información de aquí como una manera de pasar el parámetro para el juego de formularios 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)
nunca he oído hablar de un curry() en Python antes, definitivamente no es un sistema incorporado en EDIT:. ... Ahh .. Acabo de notar el puesto vinculados: En django.utils .functional import curry – Rich
¿Esto todavía funciona en Django 1.5? Obtengo el siguiente error: __init __() Obtuve un argumento inesperado de palabra clave 'empty_permitted' – Puzzled79