为了账号安全,请及时绑定邮箱和手机立即绑定

Django 表单集 - 如何为模型表单集中的每个表单提供不同的查询集

Django 表单集 - 如何为模型表单集中的每个表单提供不同的查询集

慕丝7291255 2021-06-14 09:05:10
我有一个模型表单 - 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)我想要在表单集中的 ClinicallyReportedSample 模型表单,它与 Sample 模型的查询集相关。例如,具有 pk 1、2 和 3 的样本对象:表格.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)所以我尝试在我的表单集中使用查询集来做到这一点视图.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)但这显示为三种形式,对于所有示例对象,查询集不起作用。这是解决这个问题的正确方法吗?
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

您需要将默认的 Sample queryset 设置为 none:


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 函数中手动设置查询集,否则将无法验证。


查看完整回答
反对 回复 2021-06-15
  • 1 回答
  • 0 关注
  • 293 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信