Django Admin表单限制下拉选项

时间:2018-08-01 12:42:48

标签: django django-forms django-admin

因此在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_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类中获得Blah的BlahAdminForm

1 个答案:

答案 0 :(得分:2)

Django ModelForm有一个instance,它是将创建或编辑的Blah实例。如果您编辑实例,则在创建表单时将通过instance参数传递该实例。如果创建新实例,则通常在super(BlahAdminForm, self).__init__(..)调用中构造该实例(但由于尚未保存,因此其id等于None)。

因此,您可以获取对表单正在编辑的实例的引用,或通过以下方式获取其id

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

因此,您可以在构造函数中或其他方法中使用此self.instance来检查(和更改)表单正在处理的实例。