所以在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 上课。
id
BlahAdminForm
Django人 ModelForm 有一个 instance 哪一个是 Blah 它将创建或编辑实例。如果您编辑了一个实例,则该实例将通过 实例 创建窗体时的参数。如果您创建了一个新实例,则该实例通常在 super(BlahAdminForm, self).__init__(..) 打电话给 id 等于 None ,因为它尚未保存)。
ModelForm
instance
Blah
实例
super(BlahAdminForm, self).__init__(..)
None
因此,您可以获取对窗体正在编辑的实例的引用,或者 身份证件 使用:
身份证件
class BlahAdminForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(BlahAdminForm, self).__init__(*args, **kwargs) blah_id = self.instance.id # ...
所以你可以用这个 self.instance 在构造函数中,或在其他方法中检查(和更改)窗体正在处理的实例。
self.instance