代码之家  ›  专栏  ›  技术社区  ›  wogsland

Django管理窗体限制下拉选项

  •  2
  • wogsland  · 技术社区  · 6 年前

    所以在Django管理中,我有一个对象更改表单,如下所示:

    class SurveyChoiceField(forms.ModelChoiceField):
        def label_from_instance(self, obj):
            return u'{0} - {1}'.format(obj.id, obj.name)
    
    
    class BlahAdminForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super(BlahAdminForm, self).__init__(*args, **kwargs)
            surveys = Survey.objects.filter(deleted=False).order_by('-id')
            self.fields['survey'] = SurveyChoiceField(queryset=surveys)
    
    
    class BlahAdmin(admin.ModelAdmin):
        form = BlahAdminForm
    

    我想将下拉列表限制为基于blah的特定类型的调查。有点像

    blah_id = self.blah.id
    blah_survey_type = Blah.objects.filter(id=blah_id).get('survey_type')
    surveys = Survey.objects.filter(deleted=False, type=blah_survey_type).order_by('-id')
    

    但我不知道怎么弄到 id 在黑暗中 BlahAdminForm 上课。

    1 回复  |  直到 6 年前
        1
  •  2
  •   willeM_ Van Onsem    6 年前

    Django人 ModelForm 有一个 instance 哪一个是 Blah 它将创建或编辑实例。如果您编辑了一个实例,则该实例将通过 实例 创建窗体时的参数。如果您创建了一个新实例,则该实例通常在 super(BlahAdminForm, self).__init__(..) 打电话给 id 等于 None ,因为它尚未保存)。

    因此,您可以获取对窗体正在编辑的实例的引用,或者 身份证件 使用:

    class BlahAdminForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
            super(BlahAdminForm, self).__init__(*args, **kwargs)
            blah_id = self.instance.id
            # ...

    所以你可以用这个 self.instance 在构造函数中,或在其他方法中检查(和更改)窗体正在处理的实例。