Django:如何从admin内联的特定成员中删除一个字段

时间:2012-08-29 12:33:44

标签: django django-forms django-admin

我在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。即

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

重要的是不要显示字段而不隐藏它(例如使用JS), 因为在我的实际工作场景中,在某些情况下,这个字段可以包含一个二进制数据,当通过表单时它会被破坏。 即 我希望last_name只能通过管理员对某些first_name进行编辑。

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

Django 1.3.1

1 个答案:

答案 0 :(得分:1)

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

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

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