【问题标题】:Django Admin Form Limit Dropdown OptionsDjango 管理表单限制下拉选项
【发布时间】:2018-08-01 12:42:48
【问题描述】:

所以在 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')

但我不确定如何在 BlahAdminForm 类中获得 Blah 的 id

【问题讨论】:

  • 即实例的id,所以格式为self.instance.id(在super(..)调用之后)。这个id 可以是None 是构造一个new Blah 的情况。
  • @WillemVanOnsem 正是我需要的。写下来作为答案,我很乐意接受。谢谢!

标签: django django-forms django-admin


【解决方案1】:

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

因此,您可以获得对表单正在编辑的实例的引用,或其id 的引用:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2021-08-25
    相关资源
    最近更新 更多