【发布时间】:2011-02-04 13:55:58
【问题描述】:
我正在尝试使用 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)
在我看来,我有:
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))
但我想将 Measurement.subject 字段限制为仅在 Experiment.subjects 查询集中定义的主题。我已经尝试了几种不同的方法来做到这一点,但我有点不确定实现这一目标的最佳方法是什么。我试图用新的查询集覆盖 BaseInlineFormset 类,但无法弄清楚如何正确传递实验参数。
更新的答案(我还包括了这里的信息作为将参数传递给表单集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)
【问题讨论】:
-
我以前从未听说过 Python 中的 curry(),它绝对不是内置的。编辑:...啊.. 我刚刚注意到链接的帖子:来自 django.utils .functional 导入咖喱
-
这在 Django 1.5 中仍然有效吗?我收到以下错误:__init__() got an unexpected keyword argument 'empty_permitted'
标签: django django-forms