我有一个模型表单 - 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 模型表单,该表单与示例模型的查询集相关。
例如,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)
所以我尝试使用表单集中的查询集来做到这一点
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)
但这显示为三种形式,对于所有 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 函数中手动设置查询集,否则它将无法验证。
关于python - Django formset - 如何为 modelformset 中的每个表单提供不同的查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52275690/