因此在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
。
答案 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
来检查(和更改)表单正在处理的实例。