【问题标题】:Django: How to remove one field from specific member of the admin inlineDjango:如何从管理员内联的特定成员中删除一个字段
【发布时间】:2012-08-29 12:33:43
【问题描述】:

我在 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), 因为在我的实际工作场景中,在某些情况下,该字段可能包含一个二进制数据,该数据在通过表单时会被破坏。 IE。 我希望 last_name 只能通过管理员对某些 first_names 进行编辑。

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

Django 1.3.1

【问题讨论】:

    标签: django django-forms django-admin


    【解决方案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
    

    【讨论】:

    • 它不会让我修复它,因为它没有足够的字符,但是您在 MemberAdminInlineForm 中有一个小错字,如果它不在代码中,我什至不会担心。 if self.intance.first_name == "Joe": 应该是 if self.instance.first_name == "Joe":
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-28
    • 2015-06-21
    相关资源
    最近更新 更多