首页 > 解决方案 > 如何在 Django 表单中仅加载活动数据

问题描述

我有一个由 ForeignKey 引用到我的个人资料的模型。在注册期间,我想加载这个仅处于活动状态的模型。

我的个人资料模型:

residence_status = models.ForeignKey("residencestatus.ResidenceStatus", verbose_name="ResidenceStatus", related_name="Profile", on_delete=models.CASCADE)

我的居留身份模型:

is_active = models.BooleanField(default=False, null=False)

创建一个单独的py文件来获取居住状态并作为对象返回(因为有很多这样的模型)

def get_residence_status():
    resObjs = ResidenceStatus.objects.all().filter(is_active=True)
    return resObjs

然后在我的表格上,将其全部加载到选项中:

class ProfileForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = "__all__"

    def __init__(self, *args, **kwargs):

        RESIDENCE_STATUS_CHOICE = {}
        
        resObj = get_residence_status()
        for x in resObj:
            print(x)
            RESIDENCE_STATUS_CHOICE['id'] = x

        super().__init__(*args, **kwargs)
        self.fields['residence_status'] = forms.ChoiceField(choices=RESIDENCE_STATUS_CHOICE)

在我的终端上,如果 print(x) 和 print(RESIDENCE_STATUS_CHOICES) 的结果如下:

特になし
{'id': <ResidenceStatus: 特になし>}
特定技能外国人
{'id': <ResidenceStatus: 特定技能外国人>}
'高度人材
{'id': <ResidenceStatus: '高度人材>}
その他
{'id': <ResidenceStatus: その他&gt;}

但是,我的模板(选择)的回报只是“d”

标签: django

解决方案


选择接受包含('key', 'value')但您将 dict 传递给它的元组列表。

 def __init__(self, *args, **kwargs):

     RESIDENCE_STATUS_CHOICE = [] # use list
        
     resObj = get_residence_status()
     for i, x in enumerate(resObj):
         print(x)
         RESIDENCE_STATUS_CHOICE.append(tuple([i+1, x]))

     super().__init__(*args, **kwargs)
     self.fields['residence_status'] = forms.ChoiceField(choices=RESIDENCE_STATUS_CHOICE)

推荐阅读