Próbuję użyć inlineformset_factory do generowania zestawu formularzy. Moje modele są zdefiniowane jako:Filtr kwerendy w 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)
moim zdaniem mam:
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))
ale chcę, aby ograniczyć pole Measurement.subject się tylko przedmioty określone w queryset Experiment.subjects. Próbowałem na kilka różnych sposobów, ale nie jestem pewien, jak najlepiej to osiągnąć. Próbowałem przeładować klasę BaseInlineFormset nowym zestawem zapytań, ale nie mogłem wymyślić, jak poprawnie przekazać parametr eksperymentu.
Updated odpowiedź (ja również informacje z tutaj jako sposób przekazać parametr do 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)
Nigdy wcześniej nie słyszałem o curry() w Pythonie, zdecydowanie nie jest ono wbudowane. EDYTOWANIE: ... Ahh .. Właśnie zauważyłem powiązany wpis: from django.utils .functional import curry – Rich
Czy to nadal działa w Django 1.5? Otrzymuję następujący błąd: __init __() otrzymałem nieoczekiwany argument słowa kluczowego "empty_permitted" – Puzzled79