动态更改Django admin内联表单的字段

时间:2012-07-30 11:57:24

标签: django admin

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

在ModelAdmin中,我可以使用get_form()来做,只需说:

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

但是我如何为InlineModelAdmin(TabularInline)做同样的事情? 我通过get_formset()和get_fieldsets()稍微步了一下,但找不到适合挂钩的地方。

3 个答案:

答案 0 :(得分:3)

您可以使用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)

答案 1 :(得分:1)

这是Django(2.1.4)最新版本的更新版本:

def get_formsets_with_inlines(self, request, obj=None):
    formsets = super(MyAdminClass, self).get_formsets_with_inlines(request, obj)
    for i in self.inlines:
        form = i.form
        # Do stuff with the form
        form.base_fields['my_field'] = forms.BooleanField(widget=forms.CheckboxInput(attrs={'checked': True}))
    return formsets

将此添加到您的主管理员模型类中,而不是内联。

答案 2 :(得分:-1)

您可以为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