首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django inlineformset_factory中的过滤器查询集

Django inlineformset_factory中的过滤器查询集
EN

Stack Overflow用户
提问于 2010-04-05 20:42:23
回答 2查看 7.1K关注 0票数 7

我正在尝试使用inlineformset_factory生成一个表单集。我的模型被定义为:

代码语言:javascript
复制
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)

在我看来,我有:

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2010-04-09 13:35:40

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

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

Forms.py:

代码语言:javascript
复制
class MeasurementForm(ModelForm):
 subject = forms.ModelChoiceField(queryset = Expirement.objects.all())
 class Meta:
   model = Measurement

Views.py:

代码语言:javascript
复制
inlineformset_factory(
  Experiment, Measurement, extra=10, 
  exclude=('experiment'), form=MeasurementForm
  )

绑定到窗体集是使用form参数完成的。

票数 3
EN

Stack Overflow用户

发布于 2010-06-18 16:21:50

我也经历过同样的问题(用有限的可能值初始化inlineform),并且更新的答案非常有效。谢谢你这么说。无论如何,我认为有些事情可以做得更好,但我不知道如何做到这一点。该解决方案的新问题是在每个inlineform中访问数据库:与其在所有相同的字段中使用相同的queryset,不如在这一行中每次重新计算它:

代码语言:javascript
复制
 self.fields["subject"].queryset = Subject.objects.filter(experiment=experiment)

在这个问题上,我说得对吗?还是有一些懒散的-django-魔术背后的引擎盖?如果我是对的,我如何避免对数据库的(可能的上百次)命中?你好,佩德罗

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2581049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档