仅当复选框为false时,django admin才显示字段

时间:2013-04-12 18:49:08

标签: django django-admin

models.py

class Menu(models.Model):

    ...
    has_submenu=models.BooleanField(default=1)
    page=models.ForeignKey(Page,null=True)

我希望django admin仅在has_submenu复选框为false时显示页面属性(所以django-admin必须为我写一些javascript :))

也许我必须扩展render_change_form方法

有什么建议吗?

3 个答案:

答案 0 :(得分:9)

我的回答:

class MenuAdmin(admin.ModelAdmin):
...
    class Media:
        js = ('/static/admin/js/hide_attribute.js',)

hide_attribute.js

hide_page=false;
django.jQuery(document).ready(function(){
    if (django.jQuery('#id_has_submenu').is(':checked')) {
        django.jQuery(".page").hide();
        hide_page=true;
    }else
    {
        django.jQuery(".page").show();
        hide_page=false;

    }
    django.jQuery("#id_has_submenu").click(function(){
        hide_page=!hide_page;
        if(hide_page)
        {
            django.jQuery(".page").hide();
        }else
        {
            django.jQuery(".page").show();
        }
    })
})

我认为这是一个简单的答案

答案 1 :(得分:1)

如何在ModelAdmin上覆盖get_form方法,如下所示:

class MenuModelAdmin(admin.ModelAdmin):
    def get_form(self, request, obj=None, **kwargs):
        self.exclude = []
        if obj and obj.has_submenu:
            self.exclude.append('page')
        return super(MenuModelAdmin, self).get_form(request, obj, **kwargs)

另外,请参阅get_form docs

答案 2 :(得分:1)

您可以扩展Django管理模板。

请遵循以下结构:

整个项目:

templates/admin/change_form.html

跨应用程序

templates/admin/<my_app>/change_form.html

跨模型

templates/admin/<my_app>/<my_model>/change_form.html

在您的情况下,看起来您只需要扩展菜单模型。 我会做以下事情:

  1. django文件夹获取 change_form.html teamplate
  2. 在对象循环内,查找页面字段
  3. has_submenu 进行条件检查以决定是否显示页面属性