在Django中隐藏内联表单

时间:2011-05-03 09:12:15

标签: django django-admin inline

我的Django ModelAdmin依赖于用户权限显示不同的表单。我用ModelForm(get_form,get_fieldsets)解决了这个问题,但是如何处理内联?

class NewsAdmin(admin.ModelAdmin):
    form = NewsAdminForm
    writing_form = NewsWritingForm

    inlines = (LinkInline, FileInline)

ModelAdmin在获取请求对象之前在ModelAdmin.__init__()中初始化它们。唯一的方法似乎是使用CSS来隐藏它们。

4 个答案:

答案 0 :(得分:5)

您可以使用ModelAdmin get_inline_instances函数。 以下代码从add_view中删除了内联:

from django.contrib import admin
from models import FooModel

class FooInline(admin.StackedInline):
    model = FooModel

class MyModelAdmin(admin.ModelAdmin):
    inlines = [FooInline]

    def get_inline_instances(self, request, obj=None):
        return obj and super(MyModelAdmin, self).get_inline_instances(request, obj) or []

答案 1 :(得分:1)

ModelAdmin.__init__()获取ModelAdmin.inlines中的类,实例化它们,并将结果存储在ModelAdmin.inline_instances中。您可以在ModelAdmin.inline_instances之后将__init__设置为空列表以删除内联。

django/contrib/admin/options.py

第243行

答案 2 :(得分:1)

我通过在self.inline_instances = []方法中设置get_readonly_fields(self, request, obj=None)的逻辑来解决这个问题。

例如,如果您想向超级用户展示内联,而不是向其他任何人展示:

def get_readonly_fields(self, request, obj=None):
    if request.user.is_superuser:
        return ()
    else:
        self.inline_instances = []
        return ()

答案 3 :(得分:0)

我使用bskinner的技巧在添加新对象时隐藏内联,并进行了两次调整:首先,我必须覆盖“inlines”,而不是“inline_instances”,其次,确保始终返回self.readonly_fields,以确保你正在保留这些东西。

def get_readonly_fields(self, request, obj=None):
    if obj: 
        # edit mode... add fields here to make them read-only when editing
        return self.readonly_fields
    else:
        self.inlines = []
        return self.readonly_fields