1

我在 Django admin 中有表格内联表格:

class MemberAdminInline(admin.TabularInline):
    model = Member
    fields = ("first_name", "last_name")
    readonly_fields = ("first_name", )

class GroupAdmin(admin.ModelAdmin):
    model = Group
    fields = ("name", "description")
    inlines = [MemberAdminInline]

我想last_name有条件地显示会员的。IE

"If first_name = "Joe": don't display show field for last_name".

真正不显示字段并且不隐藏它很重要(例如使用 JS),因为在我的实际工作场景中,在某些情况下,该字段可能包含二进制数据,当通过表单时会被破坏。即我只想last_name通过管理员对某些first_names 进行编辑。

我已经尝试为内联和有条件地从那里删除字段提供自定义表单,或者readonly_fields在各个阶段动态地在列表中包含字段,但是 Django 仍然总是试图找到我想要隐藏字段的字段。

Django 1.3.1

4

1 回答 1

2

似乎 Django 在内联创建时计算表单集的字段列表,然后表单集坚持这些字段存在。

因此,我发现克服这个问题的唯一方法是在需要时实际忽略保存的值:

class MemberAdminInlineForm(forms.ModelForm):
    def clean_last_name(self):
        if hasattr(self, "instance"):
            if self.instance.first_name == "Joe":
                return self.instance.last_name
        return self.cleaned_data["last_name"].

class MemberAdminInline(admin.TabularInline):
    model = Member
    fields = ("first_name", "last_name")
    readonly_fields = ("first_name", )
    form = MemberAdminInlineForm
于 2012-08-29T12:33:43.783 回答