如何使用admin.ModelAdmin自定义"添加"弹出?

时间:2014-08-14 07:16:36

标签: python django django-admin

故事以2个模型(UserClientAccount)开头,这些模型与额外的M2M模型相关联。

可以在编辑ClientAccount期间创建User。该页面将显示一个弹出窗口,允许您创建新的ClientAccount。但问题是:我可以禁用链接到ClientAccount的{​​{1}}的外键字段吗?这很令人困惑。

Description

代码在这里:

User

2 个答案:

答案 0 :(得分:0)

如果您只想隐藏ClientAccount中的m2m字段,可以删除Admin.py中的行

因为你明确地说它应该在tabularInline中显示与用户的连接:

class ClientAccountAdmin(TimeLimitedAdmin):
    class UserInline(admin.TabularInline):
        model = ClientAccount.users.through
    #inlines = [UserInline,]

在那里,您明确表示您希望在内联中将ClientAccount中的M2M字段设置为用户,这是您不想要的。摆脱它,字段将消失

编辑: 问题是“添加...”链接将始终引用.../ClientAccount/add/?_popup=1页面,该页面使用此模型的默认管理视图。

答案 1 :(得分:0)

我意识到这是一个古老的问题,但是我在寻求解决类似问题时遇到了最相关的问题(仅在添加弹出窗口中隐藏FK内联)。我敢肯定您现在已经把这个问题抛在了后面,但是也许其他人会发现它有用。

我将以下内容添加到了弹出菜单所针对的ModelAdmin类中。我检查request是否有GET参数,这些参数仅在启动弹出对话框时出现,如果存在,则循环浏览内联并删除不需要的内联。

def get_inline_instances(self, request, obj=None):
    inline_instances = super().get_inline_instances(request, obj=None)
    if '_to_field' in request.GET and '_popup' in request.GET:
        # Popup dialog is open.
        unwanted_inline = None
        for inline in inline_instances:
            inline_model_name = inline.opts.model.__name__
            if inline_model_name == 'UnwantedModelName':
                unwanted_inline = inline
        if unwanted_inline:
            inline_instances.remove(unwanted_inline)
    return inline_instances

在您的情况下,我将上述内容添加到ClientAccountAdmin中,删除了UserInline