【问题标题】:Django formset - how to give a different queryset for each form within the modelformsetDjango formset - 如何为modelformset中的每个表单提供不同的查询集
【发布时间】:2018-09-11 12:13:17
【问题描述】:

我有一个模型表单 - ClinicallyReportedSample,它链接到一个样本模型。

我正在尝试为 ClinicallyReportedSample 创建一个表单集,其中基于 Sample 的查询集,显示特定数量的表单,以便用户可以添加数据。

目前,Sample 模型有条目,但 ClinicallyReportedSample 模型完全为空:

型号:

class Sample(models.Model):

    request_number = models.PositiveIntegerField()
    year = models.PositiveIntegerField()


    class Meta:
        db_table = "sample"
        unique_together = (('request_number', 'year'),)

    def __str__(self):
        return("%s/%s" %(self.request_number, self.year))



class ClinicallyReportedSample(models.Model):

    sample_id = models.ForeignKey(Sample,
                                on_delete=models.CASCADE,
                                db_column='sample_id')


    reported = models.BooleanField(default=False)
    evidence = models.TextField(null=True, blank=True)

    ... other fields ...

    class Meta:
        db_table = "clinically_reported_sample"
        unique_together = (('sample_id'),)

    def __str__(self):
        clinically_reported_sample = str(self.sample_id)
        return(clinically_reported_sample)

我想要在表单集中与 Sample 模型的查询集相关的 ClinicallyReportedSample 模型表单。

例如,具有 pk 1、2 和 3 的示例对象:

forms.py:

class BaseCRSFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # self.queryset = ClinicallyReportedVariant.objects.none()


class CRSForm(forms.ModelForm):

    class Meta:
        model = ClinicallyReportedSample
        fields = ('sample_id', 'evidence',)

    def __init__(self, *args, **kwargs):
        super(CRSForm, self).__init__(*args, **kwargs)

所以我尝试在我的表单集中使用查询集来做到这一点

views.py:

def get(self, request, *args, **kwargs):


    sample_obj = Sample.objects.filter(id__in=[1, 2, 3])

    formset = modelformset_factory(
                ClinicallyReportedSample,
                form=self.crsform,
                formset=BaseCRSFormSet,
                extra=3,
            )


    formset = formset(queryset=sample_obj)

但这显示为三种形式,对于所有示例对象,查询集不起作用。这是解决此问题的正确方法吗?

【问题讨论】:

    标签: python django forms django-forms


    【解决方案1】:

    您需要将默认 Sample 查询集设置为无:

    class CRSForm(forms.ModelForm):
    
        class Meta:
            model = ClinicallyReportedSample
            fields = ('sample_id', 'evidence',)
    
        sample_id = forms.ModelChoiceField(queryset=Sample.objects.none())
    
        def __init__(self, *args, **kwargs):
            super(CRSForm, self).__init__(*args, **kwargs)
    

    然后当你创建一个表单集实例时,像这样手动分配查询集:

    def get(self, request, *args, **kwargs):
    
        sample_obj = Sample.objects.filter(id__in=[1, 2, 3])
    
        formset = modelformset_factory(
                    ClinicallyReportedSample,
                    form=self.crsform,
                    formset=BaseCRSFormSet,
                    extra=3,
                )
    
    
        formset = formset(queryset=sample_obj)
    
        for form in formset:
            form.fields['sample_id'].queryset = sample_obj
    

    请注意,您还必须在 POST 函数中手动设置查询集,否则将无法验证。

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 2011-11-14
      • 2013-02-18
      • 2018-07-23
      • 2021-10-10
      • 2022-11-05
      • 2021-03-16
      • 2020-11-03
      • 2022-01-05
      相关资源
      最近更新 更多