django - 在 Django inlineformset_factory 中过滤查询集

标签 django django-forms

我正在尝试使用 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 的一种方式):

View .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))

表格.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)

最佳答案

(编辑:没有正确读取代码块,这应该是您问题的解决方案):

相信您需要:http://docs.djangoproject.com/en/dev/ref/forms/fields/#modelchoicefield

Forms.py:

class MeasurementForm(ModelForm):
 subject = forms.ModelChoiceField(queryset = Expirement.objects.all())
 class Meta:
   model = Measurement

View .py:
inlineformset_factory(
  Experiment, Measurement, extra=10, 
  exclude=('experiment'), form=MeasurementForm
  )

绑定(bind)到表单集是使用表单参数完成的。

关于django - 在 Django inlineformset_factory 中过滤查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2581049/

相关文章:

python - 如何将请求上下文重定向到 Django 中的另一个 url

django - 当模型不允许时,如何在表单中允许空白选项(在 django 中)

php - 如何通过 django 和 php 在同一域上提供动态内容?

python - Django:更改表单集错误消息

python - ModuleNotFoundError : No module named 'bootstrap4'

python - Django - 在无效表单提交中保存字段

python - 使用 SUDS Python WSDL 客户端和 Django Sentry,带有 __sentry__ 属性的异常

python:两种方式的部分信用卡存储加密

使用 CheckboxSelectMultiple 小部件对 ModelChoiceField 表单进行 django 单元测试

具有一对一关系的 Django 模型?