【问题标题】:Dynamically change field of Django admin inline form动态更改 Django 管理内联表单的字段
【发布时间】:2012-07-30 11:57:24
【问题描述】:

我想将 CharField 动态更改为 ChoiceField,因为我希望从当前请求确定的可能性列表中选择值。

在 ModelAdmin 中,我可以使用 get_form() 做到这一点,然后说:

form.base_fields[field_name] = forms.ChoiceField(...)

但是我怎样才能为 InlineModelAdmin (TabularInline) 做同样的事情? 我通过 get_formset() 和 get_fieldsets() 走了一点路,但找不到合适的位置。

【问题讨论】:

    标签: django admin


    【解决方案1】:

    您可以使用 get_formsets 方法,例如 get_form 用于内联。这是django.contrib.admin.options.ModelAdmin的默认版本:

    def get_formsets(self, request, obj=None):
        for inline in self.inline_instances:
            yield inline.get_formset(request, obj)
    

    【讨论】:

    • 谢谢! “formset = inline.get_formset(request, obj)” 后跟“form = formset.form”,然后我就可以像在 ModelAdmin 中那样继续了。
    • 在 django 代码上看到的警告:“ModelAdmin.get_formsets() 已弃用,将在 Django 1.9 中删除。改用 ModelAdmin.get_formsets_with_inlines()”
    • 明确一点,get_formsets 将是内联类的一个方法,对吧?出于某种原因,这里没有调用 get_formsets =/
    【解决方案2】:

    你可以给 InlineModelAdmin 一个表单类:

    https://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-options

    或者对于动态的东西,你可以覆盖 get_form 方法:

    https://github.com/django/django/blob/master/django/contrib/admin/options.py#L431

    【讨论】:

    • 表单不是静态变化的,而是在运行时确定的。在 InlineModelAdmin 中未调用 get_form()。
    最近更新 更多